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;
}
#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;
}
相关文章推荐
- hdu1005--(Number Sequence)
- HDU 1005 Number Sequence
- HDU - 1005 Number Sequence 周期是48?不,是336!
- HDU 1005 Number Sequence
- HDU——1005——Number Sequence
- hdu 1005 Number Sequence
- hdu 1005 Number Sequence
- HDU 1005 Number Sequence (数学规律)
- HDU 1005 Number Sequence 找规律
- HDU 1005 Number Sequence
- HDU 1005 Number Sequence(基础矩阵快速幂)
- HDU 1005 Number Sequence[数论]
- HDU-1005-Number Sequence
- HDU 1005 Number Sequence
- hdu 1005 Number Sequence
- hdu 1005 Number Sequence
- HDU 1005 Number Sequence
- hdu1005 Number Sequence
- HDU 1005 Number Sequence
- HDU 1005-Number Sequence(找规律)