hdoj 1005 Number Sequence

来源:互联网 发布:关于java 编辑:程序博客网 时间:2024/05/19 05:34

http://acm.hdu.edu.cn/showproblem.php?pid=1005
题意是给定A、B、n,数列f(n)满足
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
n最大到10^8暴力模拟肯定T了,所以找规律,因为是mod7,所以f[n-1]和f[n-2]肯定属于[0,6],分别有7种可能,组合一下就是49种,所以第49个数与第1个数相等,即f[i]==f[i+48],也就是每48个数一次循环,即f[i]==f[i%48]

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;int n,A,B,f[1010];int main(){    while(scanf("%d%d%d",&A,&B,&n)&&(A||B||n))    {        f[1]=1;f[2]=1;        for(int i=3;i<=48;i++)            f[i]=(A*f[i-1]+B*f[i-2])%7;        printf("%d\n",f[n%48]);    }}