user-0 提问: 杭电ACM1005 Number Sequence

回复:
user: user-1
content: 引用 7 楼 angel_su 的回复:虽然ac，感觉if (a[i]==1 && a[i-1]==1) break武断认为开头就是循环的起始点，譬如ab都是7的倍数，第三项以后都为0，跟开头2项无关... 说明那oj上的数据弱……

user: user-2
content: 虽然ac，感觉if (a[i]==1 && a[i-1]==1) break武断认为开头就是循环的起始点，譬如ab都是7的倍数，第三项以后都为0，跟开头2项无关...

user: user-3
content: 如下修改AC: #include<stdio.h> int main(void) {   int a[101];//改 __int64 a[100000];   int A,B,n,i;   while(scanf("%d%d%d",&A,&B,&n)!=EOF&&!(A==0&&B==0&&n==0))   {       a[1]=1;a[2]=1;     if (n>=3) //加     {       for(i=3;i<100;i++) //改 for(i=3;i<=n;i++)       {         a[i] = (A * a[i - 1] + B * a[i - 2])%7;         if (a[i]==1 && a[i-1]==1) break; //加       }       i-=2; //加       n%=i; //加       if (n==0) n=i; //加     }     printf("%d\n",a[n]);//改 printf("%I64d\n",a[n]);   }   return 0; //加 }

user: user-4
content: f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.      =(A MOD 7 * f(n-1) MOD 7+B MOD 7 * f(n-2)) MOD 7,  一个起点，36（6x6)种组合, 找出周期率，把数据写在程序里面，常数时间可解。  研究程序:  #include <vector> #include <iostream>  using namespace std;  void span(vector<int>& vi, int a, int b);  int main() { 	for(int a=1; a<7; ++a) 		for(int b=1; b<7; ++b) 		{ 	 			vector<int> vi; 			span(vi,a,b); 			cout<<'('<<a<<','<<b<<')'; 			for(auto i:vi) 				cout<<' '<<i; 			cout<<endl; 		} }  void span(vector<int>& vi, int a, int b) { 	vi.push_back(1); 	vi.push_back(1); 	while(true) 	{ 		vi.push_back((a*vi[vi.size()-2]+b*vi[vi.size()-1])%7); 		if(vi[vi.size()-2]==vi[0] && vi[vi.size()-1]==vi[1]) 		{ 			vi.pop_back(); 			vi.pop_back(); 			break; 		} 	}  }   输出  (1,1) 1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 (1,2) 1 1 3 0 3 6 (1,3) 1 1 4 6 1 2 0 2 6 6 3 1 6 5 0 5 (1,4) 1 1 5 0 5 6 1 3 6 6 2 0 2 1 6 4 (1,5) 1 1 6 3 0 3 (1,6) 1 1 0 1 6 2 4 5 6 6 0 6 1 5 3 2 (2,1) 1 1 3 5 4 0 (2,2) 1 1 4 3 0 6 5 1 5 5 6 1 0 2 4 5 4 4 2 5 0 3 6 4 6 6 3 4 0 1 2 6 2 2 1 6 0 5 3 2 3 3 5 2 0 4 1 3 (2,3) 1 1 5 3 5 0 3 2 5 5 4 1 4 0 1 3 4 4 6 5 6 0 5 1 6 6 2 4 2 0 4 5 2 2 3 6 3 0 6 4 3 3 1 2 1 0 2 6 (2,4) 1 1 6 5 4 5 0 3 5 5 2 4 6 4 0 1 4 4 3 6 2 6 0 5 6 6 1 2 3 2 0 4 2 2 5 3 1 3 0 6 3 3 4 1 5 1 0 2 (2,5) 1 1 0 2 3 5 3 4 5 5 0 3 1 4 1 6 4 4 0 1 5 6 5 2 6 6 0 5 4 2 4 3 2 2 0 4 6 3 6 1 3 3 0 6 2 1 2 5 (2,6) 1 (3,1) 1 1 4 0 5 5 6 0 4 4 2 0 6 6 3 0 2 2 1 0 3 3 5 0 (3,2) 1 1 5 6 6 2 (3,3) 1 1 6 0 4 5 6 5 5 2 0 6 4 2 4 4 3 0 2 6 3 6 6 1 0 3 2 1 2 2 5 0 1 3 5 3 3 4 0 5 1 4 (3,4) 1 1 0 3 5 1 5 2 2 0 6 3 2 3 4 4 0 5 6 4 6 (3,5) 1 (3,6) 1 1 2 1 5 5 3 5 4 4 1 4 6 6 5 6 2 2 4 2 3 3 6 3 (4,1) 1 1 5 2 1 2 6 0 3 3 1 6 3 6 4 0 2 2 3 4 2 4 5 0 6 6 2 5 6 5 1 0 4 4 6 1 4 1 3 0 5 5 4 3 5 3 2 0 (4,2) 1 1 6 2 0 1 2 1 3 3 4 6 0 3 6 3 2 2 5 4 0 2 4 2 6 6 1 5 0 6 5 6 4 4 3 1 0 4 1 4 5 5 2 3 0 5 3 5 (4,3) 1 1 0 4 5 3 (4,4) 1 (4,5) 1 1 2 0 1 5 1 4 3 3 6 0 3 1 3 5 2 2 4 0 2 3 2 1 6 6 5 0 6 2 6 3 4 4 1 0 4 6 4 2 5 5 3 0 5 4 5 6 (4,6) 1 1 3 1 4 0 2 5 3 3 2 3 5 0 6 1 2 2 6 2 1 0 4 3 6 6 4 6 3 0 5 2 4 4 5 4 2 0 1 6 5 5 1 5 6 0 3 4 (5,1) 1 1 6 4 6 5 0 4 4 3 2 3 6 0 2 2 5 1 5 3 0 (5,2) 1 1 0 5 3 3 0 1 2 2 0 3 6 6 0 2 4 4 0 6 5 5 0 4 (5,3) 1 (5,4) 1 1 2 6 6 5 (5,5) 1 1 3 6 3 3 2 4 2 2 6 5 6 6 4 1 4 4 5 3 5 5 1 2 (5,6) 1 1 4 1 5 0 4 3 3 5 3 1 0 5 2 2 1 2 3 0 1 6 6 3 6 2 0 3 4 4 2 4 6 0 2 5 5 6 5 4 0 6 (6,1) 1 1 0 6 6 0 (6,2) 1 (6,3) 1 1 2 5 6 6 5 2 (6,4) 1 1 3 4 6 6 4 3 (6,5) 1 1 4 5 0 2 3 6 6 3 2 0 5 4 (6,6) 1 1 5   a+b=8的时候及其容易，剩下要保存的数据实在不多。

user: user-4
content: f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.      =A MOD 7 * f(n-1) MOD 7+B MOD 7 * f(n-2),  一个起点，49（7x7)种组合,其中若一个为0的是trival的，剩下的36种，找出周期率，把数据写在程序里面，常数时间可解。

user: user-1
content: n这么大，你这么做不TLE才怪。

user: user-5
content: about algorithm

user: user-6
content: 注意周期和规律