51nod 1126 - 求递推序列的第N项 - [找规律]
题目链接:https://cn.vjudge.net/problem/51Nod-1126
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)Output输出f(n)的值。Sample Input
3 -1 5
Sample Output
6
题解:
一看是mod 7的,显然f[i]是有循环节规律的,我们找出循环节长度即可。
AC代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1e3+5; int f[maxn]; int vis[8][8][8],len; int A,B,n; int main() { scanf("%d%d%d",&A,&B,&n); memset(vis,0,sizeof(vis)); f[1]=f[2]=1; for(int i=3;;i++) { f[i]=((A*f[i-1]+B*f[i-2])%7+7)%7; if(i==n) { cout<<f[i]<<endl; return 0; } if( !vis[ f[i-2] ][ f[i-1] ][ f[i] ] ) { vis[ f[i-2] ][ f[i-1] ][ f[i] ] = i; } else { len=i-vis[ f[i-2] ][ f[i-1] ][ f[i] ]; break; } } if(n%len==0) cout<<f[len]<<endl; else cout<<f[n%len]<<endl; }
PS.需要注意这里的取模运算与C的%的一定的区别:http://www.cnblogs.com/dilthey/p/8306069.html
转载请注明出处:https://dilthey.cnblogs.com/