user-0 提问: 杭州OJ我为什么过不了啊， 说我time exceed

回复:
user: user-0
content: 引用 5 楼 xsklld的回复:[quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 我还是没想出来。为什么会是48，是某种算法?还是数学规律?

user: user-1
content: mark

user: user-2
content: 1楼装b失败。 终于在3楼挽回装b面子。

user: user-3
content: 不要迷信各种OJ

user: user-4
content: 引用 7 楼 xsklld 的回复:[quote=引用 5 楼 xsklld 的回复:] [quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。[/quote] 刚刚试了下提交这个代码，居然被接受了，可它有明显的错误啊！  引用 7 楼 xsklld 的回复:[quote=引用 5 楼 xsklld 的回复:] [quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。[/quote] 试着提交了一下，居然成功了，可这算法明显有错误，估计网站自己设定的算法有问题。

user: user-4
content: 这个n <= 100,000,000，所你的方法会超时。 由于f(n)只能取0-6，所以f(n)、f(n+1) 只有49种可能组合，所以当序列长度超过50时，必然能找到 n,有f(n)=f(1),f(n+1)=f(2)。 由于f（n）值只取决于前二个数，所以然后有f(n+2)=f(3),f(n+3)=f(4)……f（2n-2）=f（n-1），也就是说，序列是循环的，这个循环序列长度不会超过49。 所以，你可以构造第3-51个数组成的序列，然后查找值1，1出现的位置和f（1）的差，即是循环序列长度，对n取模，然后查数组获取结果。

user: user-5
content: 引用 5 楼 xsklld 的回复:[quote=引用 4 楼 qq_36496856 的回复:] [quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。[/quote] 另外这个代码也是错的。最明显的错误便是没有定义arr[0]，而当n=48时会输出未定义的arr[0]。 当然算法本身也是错的，一个反例便是a=7, b=3时，a[49]=5≠a[1]。 但这个算法蕴含了解此题的重要思想（参考5楼），楼主可以再想想。

user: user-6
content: 这种问题用矩阵快速幂算法

user: user-5
content: 引用 4 楼 qq_36496856 的回复:[quote=引用 3 楼 user-7的回复:][quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。[/quote] 真的懂了吗？ 为什么只循环48次？ 最后为什么输出arr[n%48]？ 这才是关键。

user: user-0
content: 引用 3 楼 user-7的回复:[quote=引用 2 楼 qq_36496856 的回复:] [quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间[/quote] 谢谢，我懂了。。。。。。

user: user-7
content: 引用 2 楼 qq_36496856 的回复:[quote=引用 1 楼 user-7 的回复:] 有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码： #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }[/quote] 有种东西叫以空间换时间

user: user-0
content: 引用 1 楼 user-7 的回复:有种东西叫时间复杂度 别人过的程序比我多了个数组，而我仅仅比他们多了两个赋值语句而已啊 这是他们的代码：[code=csharp #include<stdio.h> int main() {     int a,b,n,i,arr[48];     while(scanf("%d %d %d",&a,&b,&n),a||b||n){         arr[1]=1;         arr[2]=1;         for(i=3;i<48;i++)             arr[i]=((a*arr[i-1]+b*arr[i-2])%7);         printf("%d\n",arr[n%48]);     }     return 0; }][/code]

user: user-7
content: 有种东西叫时间复杂度