洛谷3746

来源:互联网 发布:淘宝允许好评返现了 编辑:程序博客网 时间:2024/06/06 09:21

一开始没去想正解,对着部分分口胡了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;}