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

来源:互联网 发布:你瞒我瞒网络歌手 编辑:程序博客网 时间:2024/05/21 12:04

题意:

有这样一个序列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

示例输出:

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;}


0 0