hdu-4990 Reading comprehension(快速幂+矩阵)

136 阅读1分钟
  • 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\n",ans); 

    return 0; 
    }

Input

  • Multi test cases,each line will contain two integers n and m. Process to end of file. 
    [Technical Specification] 
    1<=n, m <= 1000000000

Output

  • For each case,output an integer,represents the output of above program.

Sample Input

  • 1 10
    3 100
    

Sample Output

  • 1
    5
    

    \

    题意:

    按照题目的代码运行肯定会超时,而且数据会爆int,所以我用了快速幂矩阵。 通项公式为f[n] = f[n -1] + 2 * f[n -2] + 1;

    ps:写矩阵相乘函数的时候自己脑抽竟然写反了两个参数。

    #include<iostream>
    #include<cstdio>
    #define ll long long
    using namespace std;
    
    struct node{
    	ll m[3][3];
    };
    
    int n,m;
    node mult(node a, node b){
    	node te;
    	for(int i = 0; i < 3; i++)
    		for(int j = 0; j < 3; j++){
    			te.m[i][j] = 0;
    			for(int k = 0; k < 3; k++){
    				te.m[i][j] += a.m[i][k] * b.m[k][j];
    				te.m[i][j] %= m; 
    			} 
    		}
    	return te;
    }
    
    ll powermod(){
    	node base={0, 2, 0, 1, 1, 0, 0, 1, 1}, ans={0, 1, 1, 0, 0, 0, 0, 0, 0};
    	while(n){
    		if(n&1) ans = mult(ans, base);
    		n = n / 2;
    		base =	mult(base, base);		
    	}	
    	return ans.m[0][0];
    }
    int main(){
    	while(scanf("%d%d", &n,&m) != EOF){
    		
    		printf("%I64d\n",powermod());
    	}
    	return 0;
    }
    


    \

本文已参与「新人创作礼」活动,一起开启掘金创作之路