Reading comprehension
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 318 Accepted Submission(s): 151
Problem Description
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
Sample Output
看到题目,数据较大,想到可能要用到公式。
最后看了BC的题解,才知道原来是递推。
注意LL
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#define PI acos(-1.0)
typedef long long LL;
const int MAX=0xfffffff;
using namespace std;
class mat{
public:
LL v[3][3];
mat(){
memset(v,0,sizeof(v));
}
};
int m;
mat matrix_mul(mat p1,mat p2)
{
mat t ;
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
if(p1.v[i][j])
for(int k=0;k<=1;k++)
t.v[i][k]=(t.v[i][k]+p1.v[i][j]*p2.v[j][k])%m;
return t;
}
mat matrix_mi(mat p,int k)
{
mat t;
for(int i=0;i<=1;i++) t.v[i][i]=1;
while(k)
{
if(k&1) t=matrix_mul(t,p);
p=matrix_mul(p,p);
k>>=1;
}
return t;
}
int main( )
{
//freopen("1.txt","r",stdin);
int n;
while(scanf("%d %d",&n,&m)!=EOF)
{
mat a;
a.v[0][0]=4,a.v[0][1]=1,a.v[1][1]=0,a.v[1][1]=1;
mat ans=matrix_mi(a,n/2);
LL aa=ans.v[0][1]*2;
if(n&1) aa=(aa*2+1)%m;
else aa=aa%m;
printf("%I64d\n",aa);
}
return 0;
}