您的位置:首页 > 产品设计 > UI/UE

HDU 1005 number sequence

2011-07-16 13:25 393 查看
一道数学题,纠结了好长时间,10^8 的话,用O(N)的算法一定会超时,考虑到模7,是一个循环问题,重要的是找出循环节,注意不一定是从f[1]出开始循环。。。

#include<iostream>
#include<cstdio>
using namespace std;
int
f[100];
int
A,B;
long long
N;
int
find(int left,int right)
{

for
(int i=1;i<left;i++)
{

if
(f[i]==f[left]&&f[i+1]==f[right])return i;
}

return
0;
}

int
main()
{

int
i,j,k;
while
(scanf("%d %d",&A,&B))
{

cin>>N;

if
(!A&&!B&&!N)break;
f[1]=1;
f[2]=1;
if
(N==1||N==2)
{

cout<<"1"<<endl;
continue
;
}

int
cycle=100;
for
(i=3;i<=N;i++)
{

f[i]=(A*f[i-1]+B*f[i-2])%7;
j=find(i-1,i);
if
(j){cycle=i-1-j;break;}
}

if
(j==0)cout<<f[N]<<endl;
else

{

k=(N-j)%cycle;
if
(k==0)cout<<f[j+cycle]<<endl;
else
cout<<f[k+j]<<endl;
}
}

return
0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: