RT,WA 后四个点。
评测记录
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,p;
struct fun
{
long long d[6][6];
}o,a;
long long mul(long long a,long long b)
{
long long c=0;
while(b)
{
if(b&1)c=(c+a)%p;
a=(a+a)%p;
b>>=1;
}
return c;
}
fun operator *(fun b,fun c)
{
fun dd;
memset(dd.d,0,sizeof(dd.d));
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
for(int k=1;k<=2;k++)dd.d[i][j]=(mul(b.d[i][k],c.d[k][j])+dd.d[i][j])%p;
}
}
return dd;
}
fun ksm(fun x,int pp)
{
if(pp==1)
{
return x;
}
fun oo=ksm(x,pp/2);
if(pp&1)return oo*oo*x;
return oo*oo;
}
long long ksmm(long long x,long long pp)
{
if(pp==1)
{
return x%p;
}
long long oo=ksmm(x,pp/2);
if(pp&1)return oo*oo%p*x%p;
return oo*oo%p;
}
int main ()
{
scanf("%lld%lld",&n,&p);
if(n<=1)printf("0\n");
else
{
n++;
a.d[1][2]=a.d[2][1]=a.d[2][2]=1;
o.d[1][1]=o.d[1][2]=1;
fun num=o*ksm(a,n-1);
printf("%lld\n",ksmm(((num.d[1][1]+num.d[1][2])%p-(n+1)%p+p)%p,n)%p);
}
return 0;
}