zoukankan      html  css  js  c++  java
  • hdu_1005_Number Sequence_201310222120

    Number Sequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 86547    Accepted Submission(s): 20560

    Problem Description
    A number sequence is defined as follows:
    f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
    Given A, B, and n, you are to calculate the value of f(n).
     
    Input
    The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
     
    Output
    For each test case, print the value of f(n) on a single line.
     
    Sample Input
    1 1 3
    1 2 10
    0 0 0
     
    Sample Output
    2
    5
     
    Author
    CHEN, Shunbao
     
    Source
     
    Recommend
    JGShining   |   We have carefully selected several similar problems for you:  1021 1019 1003 1009 1108
     
    又是一道给出了运算公式的数学,凡是没有优化的话,超时超内存等等是避免不了的了。(错了好多次就是因为这,百度了下才明白)这题很显然是一个找规律的题目,也就是该题的求解中是存在循环节的。
      对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了。由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过循环节出现了,注意循环节并不一定会是开始的 1,1 。 又因为一组测试数据中f[n]只有49中可能的答案,最坏的情况是所有的情况都遇到了,那么那也会在50次运算中产生循环节。找到循环节后,就可以轻松解决了。
     
    代码如下:
     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main()
     5 {    
     6     int a,b,n;
     7     while(scanf("%d %d %d",&a,&b,&n),a||b||n)
     8     {
     9         int i,xh=0;
    10         int f[100];
    11         memset(f,0,sizeof(f));
    12         f[1]=f[2]=1;
    13         for(i=3;i<100;i++)
    14         {
    15             f[i]=(a*f[i-1]+b*f[i-2])%7;
    16             if(f[i]==1&&f[i-1]==1)
    17             break;
    18         }
    19         xh=i-2;
    20         n=n%xh;
    21         if(n==0)
    22         n=xh;
    23         //for(i=1;i<60;i++)
    24         //printf("%d ",f[i]);
    25         printf("%d
    ",f[n]);
    26     }
    27     return 0;
    28 }


    网上简洁做法:

    http://www.189works.com/article-19050-1.html

     
  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3383314.html
Copyright © 2011-2022 走看看