您的位置:首页 > 产品设计 > UI/UE

杭电OJ(HDOJ)1005题:Number Sequence(规律递推)

2014-11-29 19:06 483 查看
题意:

有这样一个序列f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.输入三个整数:A,B,N (1 <= A, B <= 1000, 1 <= n <= 100,000,000),求出序列中第N个数是多少。A,B,N同时为0结束。

示例输入:

1 1 3

1 2 10

0 0 0

示例输出:

2

5

解决方案:

f(n)=(A*f(n-1)+B*(f-2))%7,计算过程中A和B的一直没有变,在变的是f(n-1)和f(n-2)。f(n)取决于前两个元素f(n-1),f(n-2),最终的结果与7相模除,f(n-1)的取值范围为[0,6],同样f(n-2)的取值范围也是[0,6],两个数的组合为(0,0),(0,1)(1,1)......(6,6)一共有7*7=49种不同的组合,但A,B的值固定不变,第49个元素之后又会重覆,然后继续下去。所以只要纪录前49个元素的值就可以。

#include<stdio.h>
int main()
{
    int a,b,n,i,arr[49]={1,1};
    while(scanf("%d%d%d",&a,&b,&n)&&(a|b|n))
    {
        for(i=2;i<49;i++)
            arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
        printf("%d\n",arr[(n-1)%49]);//数组下标从0开始,所以n先减1
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: