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;
}