1005Number Sequence

考察鸽巢原理的应用,数字的取值有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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值