zoukankan      html  css  js  c++  java
  • HDU1757 A Simple Math Problem 矩阵快速幂

    A Simple Math Problem

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4331    Accepted Submission(s): 2603

    Problem Description
    Lele now is thinking about a simple function f(x).
    If x < 10 f(x) = x.
    If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
    And ai(0<=i<=9) can only be 0 or 1 .
    Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.
     
    Input
    The problem contains mutiple test cases.Please process to the end of file.
    In each case, there will be two lines.
    In the first line , there are two positive integers k and m. ( k<2*10^9 , m < 10^5 )
    In the second line , there are ten integers represent a0 ~ a9.
     
    Output
    For each case, output f(k) % m in one line.
     
    Sample Input
    10 9999
    1 1 1 1 1 1 1 1 1 1
    20 500
    1 0 1 0 1 0 1 0 1 0
     
    Sample Output
    45
    104
     
    题意:给出递推公式求第n项
    题解:矩阵快速幂,注意初始矩阵为[9,8,7,6,5,4,3,2,1,0]
    #include<bits/stdc++.h>
    #define N 10
    #define mes(x) memset(x, 0, sizeof(x));
    #define ll __int64
    long long mod = 1e9+7;
    const int MAX = 0x7ffffff;
    using namespace std;
    struct mat{
        ll a[N][N];
        mat(){
            memset(a, 0, sizeof(a));
        }
        mat operator *(mat b){
            mat c;
            for(int i=0;i<N;i++)
                for(int j=0;j<N;j++)
                for(int k=0;k<N;k++)
                c.a[i][j] = (c.a[i][j] + a[i][k]*b.a[k][j])%mod;
            return c;
        }
    };
    mat f(mat x,ll m){
        mat t;
        for(int i=0;i<N;i++)
            t.a[i][i] = 1;
        while(m){
            if(m&1) t = t*x;
            x = x*x;
            m >>= 1;
        }
        return t;
    }
    int main()
    {
        ll k, i;
        while(~scanf("%I64d%I64d", &k, &mod)){
            if(k<10){
                printf("%I64d
    ", k);
                continue;
            }
            mat A, s;
            for(i=0;i<10;i++)
                s.a[0][i] = 9-i;
            for(i=0;i<10;i++)
                scanf("%I64d", &A.a[i][0]);
            for(i=0;i<9;i++)
                A.a[i][i+1] = 1;    
            s = s*f(A, k-9);
            printf("%I64d
    ", s.a[0][0]);
        }
        
        return 0;
    }
  • 相关阅读:
    敏捷21天打卡-AARRR模型
    敏捷21天打卡-精益产品开发最佳实践 之 “AB测试"
    21天敏捷打卡-MVP
    敏捷21天打卡-精益产品开发最佳实践 之 “电梯演讲"
    敏捷21天打卡-精益画布
    敏捷21天打卡--精益产品开发
    21天敏捷打卡--敏捷方法实现
    敏捷21天打卡-在敏捷环境中交付
    敏捷21天打卡-创建敏捷环境
    敏捷21天打卡-生命周期
  • 原文地址:https://www.cnblogs.com/Noevon/p/6111373.html
Copyright © 2011-2022 走看看