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;

}

 

你可能感兴趣的:(HDU)