• 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;
    }
    
  • 相关阅读:
    动态为datagrid增加控件
    对DataGrid中的ListBox设置值
    Enhancing Inserting Data through the DataGrid Footer, Part 2
    Setting Focus to a TextBox in an EditItemTemplate
    Enhancing Inserting Data through the DataGrid Footer
    CRM选择行变色
    【转】on delete cascade
    VS如何连接2种类型的数据库
    SQL Server 已配置为允许远程连接 解决办法
    【转】sql server 重命名表字段
  • 原文地址:https://www.cnblogs.com/sola1994/p/3923647.html
Copyright © 2020-2023  润新知