1126は、シーケンスのN番目の項目(51 nod)をデリバリーすることを求める。

4534 ワード

ソースリンクhttp://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126
この問題はまず彼の周期を求めるべきです。。。。
 for(i=3;i<300;i++)
        {
            f[i]=((A*f[i-1]+B*f[i-2])%7+7)%7; 
            if(f[i-1]==1&&f[i]==1)
            break; 
        } f[i-1]==1&&f[i]==1          ,  i-2      
ここではn%( i-2)==0の場合に注意します。f[0]=f[i-2]で、n=i-2です。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000;
int f[maxn];
int main()
{
    int A,B,n;
    while(scanf("%d %d %d",&A,&B,&n)!=EOF)
    {
        memset(f,0,sizeof(f));
        if(n==1||n==2)
        {
            printf("1
"); continue; } f[1]=1;f[2]=1; int i; for(i=3;i<300;i++) { f[i]=((A*f[i-1]+B*f[i-2])%7+7)%7; if(f[i-1]==1&&f[i]==1) break; } f[0]=f[i-2]; printf("%d
",f[n%(i-2)]); } return 0; }