考察鸽巢原理的应用,数字的取值有k种可能的话,这样的数字取n位组成的n位序列有k^n中可能的排列,任取n+k^n位数字组成一个序列,里面有k^n+1个n位排列,其中一定有重复的。好比有10种颜色的玻璃球,放在11个盒子里,必定有两个球的颜色一样。
这里取值范围是0~6共7个,在f的序列中任取两个数的排列有49种(带入公式得51=2+7^2)那么在f[51]的时候必定已经有了循环。因为51个数字需要50个两位数的排列,一定有两个两位数的排列是相同的。因为f是由两个起始点决定的序列,所以出现两个相同的两位序列就开始了循环。
#include <iostream>
using namespace std;
int main()
{
int n, a, b, f[52]={1,1,1};
while(cin>>a>>b>>n,a|b|n)
{
for( int i = 3 ; i <52 ; i++)
f[i] = (a*f[i-1] +b*f[i-2])%7;
printf("%d\n" ,f[n%52]);
}
}
在这里本来应该求出f[0]这个位的循环的对应位的值,再赋给f[0]才能说没有错,但不这么做,直接给f[0]赋值为1也ac了