• Reading comprehension HDU


    Read the program below carefully then answer the question. 
    #pragma comment(linker, "/STACK:1024000000,1024000000") 
    #include <cstdio> 
    #include<iostream> 
    #include <cstring> 
    #include <cmath> 
    #include <algorithm> 
    #include<vector> 

    const int MAX=100000*2; 
    const int INF=1e9; 

    int main() 

      int n,m,ans,i; 
      while(scanf("%d%d",&n,&m)!=EOF) 
      { 
        ans=0; 
        for(i=1;i<=n;i++) 
        { 
          if(i&1)ans=(ans*2+1)%m; 
          else ans=ans*2%m; 
        } 
        printf("%d ",ans); 
      } 
      return 0; 
    }

    InputMulti test cases,each line will contain two integers n and m. Process to end of file. 
    [Technical Specification] 
    1<=n, m <= 1000000000OutputFor each case,output an integer,represents the output of above program.Sample Input

    1 10
    3 100

    Sample Output

    1
    5

    直接利用源程序暴力打出 1,2,5,10,21,42 找出规律 fn = fn-1 + 2*fn-2+1

    数据比较大,直接求矩阵快速幂。

    推出 转化矩阵为:

    1 2 1
    1 0 0
    0 0 1
    

     初始矩阵为

    1 2 1
    

     直接上代码:

    //Asimple
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <queue>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <set>
    #include <map>
    #include <cmath>
    #define swap(a,b,t) t = a, a = b, b = t
    #define CLS(a, v) memset(a, v, sizeof(a))
    #define test() cout<<"============"<<endl
    #define debug(a)  cout << #a << " = "  << a <<endl
    #define dobug(a, b)  cout << #a << " = "  << a << " " << #b << " = " << b << endl
    using namespace std;
    typedef long long ll;
    const int N=3;  
    //const ll MOD=10000007; 
    const int INF = ( 1<<20 );
    const double PI=atan(1.0)*4;
    const int maxn = 10+5;
    const ll mod = 10005;
    int n, m, len, ans, sum, v, w, T, num;
    int MOD;
    
    struct Matrix {
        long long grid[N][N];  
        int row,col;  
        Matrix():row(N),col(N) {  
            memset(grid, 0, sizeof grid);  
        }  
        Matrix(int row, int col):row(row),col(col) {  
            memset(grid, 0, sizeof grid);  
        }
        
        //矩阵乘法
        Matrix operator *(const Matrix &b) {  
            Matrix res(row, b.col);  
            for(int i = 0; i<res.row; i++)  
                for(int j = 0; j<res.col; j++)  
                    for(int k = 0;k<col; k++)  
                        res[i][j] = (res[i][j] + grid[i][k] * b.grid[k][j] + MOD) % MOD;  
            return res;  
        }
        
        //矩阵快速幂
        Matrix operator ^(long long exp) {  
            Matrix res(row, col);
            for(int i = 0; i < row; i++)
                res[i][i] = 1;
            Matrix temp = *this;
            for(; exp > 0; exp >>= 1, temp = temp * temp)
                if(exp & 1) res = temp * res;
            return res;
        }
        
        long long* operator[](int index) {
            return grid[index];
        }
        
        void print() {
        
            for(int i = 0; i <row; i++) {
                for(int j = 0; j < col-1; j++)  
                    printf("%d ",grid[i][j]);  
                printf("%d
    ",grid[i][col-1]);  
            }  
        }  
    };
    
    void input(){
        ios_base::sync_with_stdio(false);
        while( cin >> n >> MOD ) {
            Matrix A;
            A[0][0] = A[0][2] = 1;
            A[0][1] = 2;
            A[1][0] = A[2][2] = 1;
            A = A^n;
            Matrix B;
            B[0][0] = B[0][2] = 1;
            B[0][1] = 2;
            A = A*B;
            if( n%2 ) cout << A[0][0] << endl;
            else cout << A[1][1] << endl;
        }
    }
    
    int main(){
        input();
        return 0;
    }
  • 相关阅读:
    线段树套线段树
    hdu6800
    半平面交 poj1279
    Unity:创建了一个自定义的找子物体的脚本
    Unity:一个简单的开门动画
    hdu 4940
    hdu 4939
    hdu 4932
    hdu 4912
    AC自动机
  • 原文地址:https://www.cnblogs.com/Asimple/p/7511504.html
Copyright © 2020-2023  润新知