题意:设(T(n)=sum_{i=1}^nif(i)),给定(n)和(m),求(T(n)mod m)的值.
某大佬的博客详细讲述了三种做法,我这里就不再赘述了.戳我
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int n,mod;
struct matrix{
int a[5][5];
matrix operator *(matrix b){
matrix c;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
c.a[i][j]=0;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j])%mod;
return c;
}
}S,T;
int main(){
n=read(),mod=read();
S.a[0][0]=0;S.a[0][1]=1;S.a[0][2]=0;S.a[0][3]=1;S.a[0][4]=0;
T.a[0][0]=0;T.a[0][1]=1;T.a[0][2]=0;T.a[0][3]=2;T.a[0][4]=0;
T.a[1][0]=1;T.a[1][1]=1;T.a[1][2]=0;T.a[1][3]=1;T.a[1][4]=0;
T.a[2][0]=0;T.a[2][1]=0;T.a[2][2]=0;T.a[2][3]=1;T.a[2][4]=0;
T.a[3][0]=0;T.a[3][1]=0;T.a[3][2]=1;T.a[3][3]=1;T.a[3][4]=1;
T.a[4][0]=0;T.a[4][1]=0;T.a[4][2]=0;T.a[4][3]=0;T.a[4][4]=1;
while(n){if(n&1)S=S*T;T=T*T;n>>=1;}
printf("%d
",S.a[0][4]);
return 0;
}