这道题我做了半天也做不出来,真是太惭愧了,后来上网一搜,发现这个题用到了精妙得数学方法,在这里和大家分享下!
抽屉原理
桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。”抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。
自己的wa码
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#define max 100000
int n[max];
int main()
{ int a,b,i,m;
while(scanf("%d%d%d",&a,&b,&m)!=EOF)
{ //if(a==b&&b==m&&a==0) break;
if(a==b==m&&a==0) break;
//if(a==b==m==0) break;
n[1]=1;
n[2]=1;
for(i=3;i<=m;i++)
{
n[i]=(a*n[i-1]+b*n[i-2])%7;
}
printf("%d\n",n[m]);
}
return 0;
}
网上的ac码
<span style="color:#333333;">#include<stdio.h>
int main()
{
int A,B,i;
long int n;
while(scanf("%d%d%ld",&A,&B,&n))
{
int a[50]; //必须定义成数组形式
a[1]=1;
a[2]=1;
if((A+B+n)==0)break;
for(i=3;i<=48;i++)
{
a[i]=(A*a[i-1]+B*a[i-2])%7;
}
n=n%48; //找到循环节
a[0]=a[48];
printf("%d\n",a[n]);
}
return 0;
} </span>
<span style="color:#333333;">
</span>
<span style="color:#333333;">
</span>
<span style="color:#ff0000;">总结与反思</span>
这题的关键就在于时间,因为n可能很大很大.但因为有mod 7,所以f(n)取值是0-6,共7个取值,而f(n)又由f(n-1) 和 f(n-2)两个决定,因此最多有7*7=49种可能的组合,因此在50以内必然出现循环,所以我们用数组模拟前49组数组,后面的数据只要mod (模除)循环节就可以了,对应的的数组里头取值。