比赛 2024年6月13日练习赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 组合数问题 最终得分 100
用户昵称 小金 运行时间 0.468 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2024-06-13 21:55:19
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
long long n,p,k,r;
long long f[60][60],a[60][60],t[60][60];
int main()
{
    freopen("problem_heoi2017.in","r",stdin);
    freopen("problem_heoi2017.out","w",stdout);
    scanf("%d%d%d%d",&n,&p,&k,&r);
    for(int i=0;i<k;i++)
    {
        f[i][i]++;
        f[i][(i-1+k)%k]++;
        a[i][i]=1;
    }
    long long x=n*k;
    while(x)
    {
        if(x&1==1)
        {
            for(int i=0;i<k;i++)
            {
                for(int j=0;j<k;j++)
                {
                    t[i][j]=a[i][j];
                    a[i][j]=0;
                }
            }
            for(int i=0;i<k;i++)
            {
                for(int j=0;j<k;j++)
                {
                    for(int l=0;l<k;l++)
                    {
                        a[i][j]=(a[i][j]+f[i][l]*t[l][j]%p)%p;
                    }
                } 
            }
        }
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<k;j++)
            {
                t[i][j]=f[i][j];
                f[i][j]=0;  
            }
        }
        x>>=1;
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<k;j++)
            {
                for(int l=0;l<k;l++)
                {
                    f[i][j]=(f[i][j]+t[i][l]*t[l][j]%p)%p;
                }
            }
        }
    }
    printf("%lld",a[0][r]);
    return 0;
}