- 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; }
\
本文已参与「新人创作礼」活动,一起开启掘金创作之路