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;
}
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\n",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; }