比赛 |
2024年6月13日练习赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
组合数问题 |
最终得分 |
100 |
用户昵称 |
darkMoon |
运行时间 |
0.482 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2024-06-13 21:07:08 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("problem_heoi2017.in");
ofstream fout("problem_heoi2017.out");
auto mread = [](){int x;fin >> x;return x;};
const int N = 55;
int n = mread(), MOD = mread(), k = mread(), r = mread();
struct node{
int a[N][N];
int n;
node(){
for(int i = 0; i < N; i ++){
for(int j = 0; j < N; j ++)
a[i][j] = 0;
}
}
friend node operator * (node a, node b){
node ans;
ans.n = a.n;
for(int i = 0; i <= a.n; i ++){
for(int j = 0; j <= a.n; j ++){
for(int k = 0; k <= a.n; k ++)
(ans.a[i][j] += a.a[i][k] * b.a[k][j] % MOD) %= MOD;
}
}
return ans;
}
};
node ksm(node x, int k){
node ans, now = x;
ans.n = x.n;
for(int i = 0; i <= x.n; i ++)
ans.a[i][i] = 1;
while(k){
if(k & 1)
ans = ans * now;
now = now * now;
k >>= 1;
}
return ans;
}
signed main(){
node f;
f.n = k - 1;
f.a[0][0] = 1;
node s;
s.n = k - 1;
s.a[k - 1][0] ++, s.a[0][0] ++;
for(int i = 1; i < k; i ++){
s.a[i][i] ++, s.a[i - 1][i] ++;
}
f = f * ksm(s, n * k);
fout << f.a[0][r];
return 0;
}