hdu 1005 (规律 循环节)

题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

        求 f(n)

思路:

这题根据公式可以得出规律 

当出现 1 1时 表示达到循环节点

因此可以打表求余得出结果

但是至于为什么49 是最大周期

找到了点资料是说

每个数是有前两个数来决定

而数的结果只有0 到6 七种可能

因此是 7*7=49 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;
int arr[10000];
int main()
{
     arr[1]=arr[2]=1;
     int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n),a||b||n)
    {
        int i,j;
        int l1,len;
        for(i=3;i<10000;i++)
        {
            arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
            for(j=1;j<=i-1;j++)
            {
                if(arr[i]==arr[j]&&arr[i-1]==arr[j-1])
                {
                    l1=j-1;
                    len=i-j;
                    break;
                }
            }
        }

		if(n>=l1)
        {
            n=(n-(l1-1))%len+(l1-1);
        }
        arr[0]=arr[len+l1-1];
        cout << arr[n] << endl;

    }
    return 0;
}

重新看了题解 还是想不通为什么循环节在 1 1 又写了个自己判断循环节的

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;
int arr[10000];
int main()
{
     arr[1]=arr[2]=1;
     int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n),a||b||n)
    {
        int i,j;
        int l1,len;
        for(i=3;i<10000;i++)
        {
            arr[i]=(a*arr[i-1]+b*arr[i-2])%7;
            for(j=1;j<=i-1;j++)
            {
                if(arr[i]==arr[j]&&arr[i-1]==arr[j-1])
                {
                    l1=j-1;
                    len=i-j;
                    break;
                }
            }
        }

		if(n>=l1)
        {
            n=(n-(l1-1))%len+(l1-1);
        }
        arr[0]=arr[len+l1-1];
        cout << arr[n] << endl;

    }
    return 0;
}
原文地址:https://www.cnblogs.com/sola1994/p/3923647.html