一开始没去想正解,对着部分分口胡了75分。
然后想正解,跟常人不同的是,我并没有把考虑k,接着就死活想不出,我真是太菜了。
#include<cstdio>
#include<cstring>
const int N=55;
int n,p,k,r,i;
long long m;
struct matrix{
int a[N][N];
inline void clear(){
memset(a,0,sizeof a);
}
matrix operator*(const matrix&x){
matrix ans;ans.clear();
register int i,j,l;
for(i=0;i<k;++i)
for(l=0;l<k;++l)
for(j=0;j<k;++j)ans.a[i][j]=(ans.a[i][j]+1ll*a[i][l]*x.a[l][j])%p;
return ans;
}
}a,b;
int main(){
scanf("%d%d%d%d",&n,&p,&k,&r);
for(i=0;i<k;++i)a.a[i][i]=1,++b.a[i][i],++b.a[i][(i+1)%k];
m=1ll*n*k;
for(;m;m>>=1,b=b*b)if(m&1)a=a*b;
printf("%d\n",a.a[r][0]);
return 0;
}