杭电ACM1005

转自:http://blog.csdn.net/middle544291353/article/details/7723427

这题看起来很容易,不过格式很多限制,比如内存,运行时间等的限制。所以递归是行不通的。

经过思考,看看组合数学,竟然还是没头脑,虽然知道周期为7*7=49.但是还是AC不了,结果无疑看到这个:

1。由题目的式子可知0<=f[n]<=6,

2。而每个f[n]又是由(f[n-1],f[n-2])这个组合通过计算得出来的,

由以上两点可以推出,(f[n-1],f[n-2])出现重复的组合的最大周期为7*7=49, 即f[n]的最大周期

所有, 我们只要算出一个周期中所有的f[n]的值并记录下周期i即可.

代码是经过一点经过修改的,还是要感谢那个写贴的博客主。得意

#include <iostream>
using namespace std;
int main()
{
 int a,b,n,i,f[53];
 while(cin>>a>>b>>n)
 {
  if(a==0 && b==0 && n==0) break;
  if(n==1 || n==1)
  {
   cout<<"1"<<endl;
   continue;
  }
  f[1]=1,f[2]=1;
  a%=7,b%=7;
  for(i=3;i<=52;i++)
  {
   f[i]=(a*f[i-1]+b*f[i-2])%7;
   if(f[i-1]==1 && f[i]==1) break;
  }
  i=i-2;
  n%=i;
  f[0]=f[i];
  cout<<f[n]<<endl;
 }
 return 0;
}


你可能感兴趣的:(ACM,杭电)