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;
}
#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;
}
[Technical Specification]
1<=n, m <= 1000000000
1 10 3 100
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;
}