/* zoj_2105 模拟 因为n是100000000的数据,直接暴力肯定不行了。。观察 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 将<f(n-1),f(n-2)>看成一个组合,则不同的组合有7*7=49中。(因为f[n-1]和f[n-2]的取值范围都是0至6) 假设循环周期为T,则f[n+T]=f[n],而T必定不超过50。找到循环周期要计算就很简单了。 */ #include <iostream> #include <cstdio> #include <string.h> using namespace std; int flag[7][7]; int num[7][7]; int f[100]; int main() { int a,b,n,i; int sta,turn; while( scanf( "%d%d%d",&a,&b,&n ) && ( a||b||n ) ) { memset( flag,0,sizeof(flag) ); f[1]=1; f[2]=1; flag[1][1]=1; num[1][1]=1; for( i=3;i<=100;i++ ) { f[i]=( a*f[i-1]+b*f[i-2] )%7; if( flag[ f[i] ][ f[i-1] ]==1 ) { sta=num[ f[i] ][ f[i-1] ]; turn=i-sta-1; } else { flag[ f[i] ][ f[i-1] ]=1; num[ f[i] ][ f[i-1] ]=i-1; } } printf( "%d\n",f[ (n-sta)%turn+sta ] ); } return 0; }