HDU 1005 题解

HDU 1005

【数学】【规律】【打表】
题目


Main Idea:

    按照题目给出公式f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7输入三个数a、b、n,计算出f(n),期中当a、b、n程序结束。

Summary:

    1.一道给出了运算公式的数学凡是没有优化的话,超时超内存等等是避免不了的了。这题很显然是一个找规律的题目,也就是该题的求解中是存在周期的。
    2.规律题会用到打表来获得一个有序表或常量表,来执行程序某一部分,优化时间复杂度。
    3.打表之后看出规律,o(1)解决。

Problem Solving Idea:

    根据题型和内存超限猜测规律题,打表,发现总会从1,1开始循环,所以,找到循环点。因为有规律,所以利用取余得到答案。

AC代码

#include <bits/stdc++.h> 
#define ll long long
using namespace std;
int f[1005]; 

int main(){
    int a=1,b=1,n=1;
    for(;;){
        int i;
        memset(f,0,sizeof(f));
        f[1]=f[2]=1;
        scanf("%d %d %d",&a,&b,&n);
        if(a==0&&b==0&&n==0)    break;
        for(i=3;i<=1001;i++){
            f[i]=(a*f[i-1] + b*f[i-2])%7;
            
                if(f[i]==1&&f[i-1]==1)
                break;
            
        }
        n=n%(i-2);
        f[0]=f[i-2];
           printf("%d
",f[n]);
        
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Fhr2001/p/11985658.html