zoukankan      html  css  js  c++  java
  • HDU 1005 题解

    HDU 1005

    【数学】【规律】【打表】
    题目


    Main Idea:

        按照题目给出公式f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7输入三个数a、b、n,计算出f(n),期中当a、b、n程序结束。
    

    Summary:

        1.一道给出了运算公式的数学凡是没有优化的话,超时超内存等等是避免不了的了。这题很显然是一个找规律的题目,也就是该题的求解中是存在周期的。
        2.规律题会用到打表来获得一个有序表或常量表,来执行程序某一部分,优化时间复杂度。
        3.打表之后看出规律,o(1)解决。
    

    Problem Solving Idea:

        根据题型和内存超限猜测规律题,打表,发现总会从1,1开始循环,所以,找到循环点。因为有规律,所以利用取余得到答案。
    

    AC代码

    #include <bits/stdc++.h> 
    #define ll long long
    using namespace std;
    int f[1005]; 
    
    int main(){
        int a=1,b=1,n=1;
        for(;;){
            int i;
            memset(f,0,sizeof(f));
            f[1]=f[2]=1;
            scanf("%d %d %d",&a,&b,&n);
            if(a==0&&b==0&&n==0)    break;
            for(i=3;i<=1001;i++){
                f[i]=(a*f[i-1] + b*f[i-2])%7;
                
                    if(f[i]==1&&f[i-1]==1)
                    break;
                
            }
            n=n%(i-2);
            f[0]=f[i-2];
               printf("%d
    ",f[n]);
            
        }
        return 0;
    }
    
  • 相关阅读:
    测试
    mysql数据库 select语句全集
    Markdown文本的书写格式详解--有道云笔记
    mysql数据忘记库密码
    最新版mysql基本命令操作
    Python从入门到放弃
    第二阶段冲刺
    周总结15
    找水王
    用户体验评价
  • 原文地址:https://www.cnblogs.com/Fhr2001/p/11985658.html
Copyright © 2011-2022 走看看