zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    ceil函数 floor函数 floor函数 round函数 取整函数
    Havel–Hakimi algorithm(判断度数序列是否可图)
    最小费用最大流
    数论 (大数,小费马定理,欧拉定理,威尔逊定理,快速数论变换(NNT)模版)
    Give Candies(费马小定理)
    Yet Another Crosses Problem
    并查集
    杭电多校第一场-M-Code
    2018ICPC赛后总结
    营业额统计
  • 原文地址:https://www.cnblogs.com/sola1994/p/3923647.html
Copyright © 2011-2022 走看看