zoukankan      html  css  js  c++  java
  • Number Sequence(快速幂矩阵)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

    Number Sequence

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


    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
     
    题意:简单的快速幂矩阵,加一个f(n-1) = f(n-1)即可
    代码:
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 struct Mtr{
     8     int a , b , c , d ;
     9     Mtr operator * (const Mtr m) const
    10     {
    11         Mtr res ;
    12         res.a = (a*m.a%7 + b*m.c%7)%7;
    13         res.b = (a*m.b%7+b*m.d%7)%7;
    14         res.c = (c*m.a%7+d*m.c%7)%7;
    15         res.d = (c*m.b%7+d*m.d%7)%7;
    16         return res;
    17     }
    18 };
    19 int cal(Mtr a , int n)
    20 {
    21     Mtr c;
    22     c.a = c.d = 1;
    23     c.b = c.c = 0;
    24     while(n>0)
    25     {
    26         if(n&1)
    27             c = c*a;
    28         a = (a*a);
    29         n/=2;
    30     }
    31     return (c.a+c.b)%7;
    32 }
    33 int main()
    34 {
    35     int a , b , n;
    36     while(~scanf("%d%d%d",&a,&b,&n)&&(a!=0||b!=0||n!=0))
    37     {
    38         Mtr tm;
    39         tm.a = a;
    40         tm.b = b;
    41         tm.c = 1;
    42         tm.d = 0;
    43         int tt = cal(tm,n-2);
    44         printf("%d
    ",tt);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    Linux命令——find
    Linux命令——locate
    python模块:datetime
    python模块:json
    python模块:shelve
    python模块:shutil
    python模块:sys
    python:OS模块
    str.index()与str.find()比较
    python模块:re
  • 原文地址:https://www.cnblogs.com/shanyr/p/4843212.html
Copyright © 2011-2022 走看看