第一次做的时候,我用的是递归的方法去解决
#include "stdio.h"
int a(int A,int B,int n)
{
int m;
if(n==1||n==2)
{
return 1;
}
else
{
return (A*a(A,B,n-1)+B*a(A,B,n-2))%7;
}
}
int main()
{
int A,B,n;
scanf("%d%d%d",&A,&B,&n);
if((A>=1&&A<=1000)&&(B>=1&&B<=1000)&&(n>=1&&n<=100000000))
{
printf("%d\n",a(A,B,n));
}
return 0;
}
但是这种方法在n较大要求内存非常大,速度也非常慢,不能通过。
然后找规律,发现f(n)是有规律的出现,几个数形成一个循环,所以就想把这个循环找出来,就可以较快的得出结果。
#include "stdio.h"
int main()
{
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
int m,s1=1,s2=1,i,flag=0;
int f[2000];
if((a>=1&&a<=1000)&&(b>=1&&b<=1000)&&(n>=1&&n<=100000000))
{
if(n>=3)
{
f[0]=1;
for(i=1;i<=n-2;i++)
{
m=s2;
s2=(a*s2+b*s1)%7;
s1=m;
f[i]=s2;
printf("%d %d %d\n",s1,s2,i);
if(s1==0&&s2==0)
{
printf("%d\n",s2);
return 0;
}
if(f[0]==s1&&f[1]==s2&&i>1)
{
flag=1;
break;
}
}
if(flag==1)
{
m=(n-2)%(i-1);
s2=f[m];
}
}
printf("%d\n",s2);
}
}
return 0;
}
这种方法还是不行,不能通过。
最后是发现f(n)由f(n-1)和f(n-2)决定,而f(n-1)和f(n-2)的组合只有7x7=49种,所以 只用得到前49次的结果就可以了。
#include<stdio.h>
int main()
{
int a[100];
int A,B,n;
a[1] = 1;
a[2] = 1;
while(scanf("%d %d %d", &A, &B, &n) && A+B+n)
{
for(int i = 3 ; i <= 49 ; i++)
{
a[i] = (A*a[i-1] + B*a[i-2])%7;
}
printf("%d\n", a[n%49]);
}
return 0;
}
总结:
acm的题目一般有些规律,所以找出规律,改善算法是我们做题时候要时刻记住的。