HDU 1005 Number Sequence

题意:给出一个递推式f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7 中的A,B和n,让你输出f(n)。


分析:找循环节。以为f(n)是由f(n-1),f(n-2)推出的,而且f(n)<7,所以组合起来最多有7*7共49种。f(1)=f(2)=1,所以可以以1,1作为循环节的头部来找循环节。(但以1,1作为循环节的头部作为循环节的头部是有问题的,但打表来看虽然有问题,但并不影响这种方法最终结果的正确性)


Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define eps 1e-7
#define LL long long
#define pb push_back
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;

int f[55];

int main()
{
    int a,b,n,i;
    f[1]=f[2]=1;
    while(scanf("%d %d %d",&a,&b,&n),a+b+n){
        for(i=3;i<50;i++){
            f[i]=(a*f[i-1]+b*f[i-2])%7;
            if(f[i]==1&&f[i-1]==1) break;
        }
       i-=2;
       n%=i;
       if(!n) printf("%d\n",f[i]);
       else   printf("%d\n",f[n]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值