提出 #38141401
ソースコード 拡げる
#include <bits/stdc++.h>
#include <atcoder/modint>
using mint = atcoder::modint;
using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)n;i++)
#define per(i,a,n) for (int i=n;i-->(int)a;)
int read(){int r;scanf("%d",&r);return r;}
const int T=100;
vector<mint> fac;
vector<mint> ifac;
mint binom(int n,int m){return (n<m or m<0)?0:(fac[n] * ifac[n-m] * ifac[m]);}
// 对n 拆分, 上一个拆分的大小为last, 这次比last大
mint dfs(int n,int K, int last, vector<pair<int, int>> &v) {
if (n == 0) {
mint ans = 1;
rep(i,0,size(v)){
auto [cyc1, num1] = v[i]; // 环大小, 个数
ans /= fac[num1] * (mint{cyc1}.pow(num1)); // 清除轮换等价
ans *= mint{K}.pow(num1); // K^m = K^{sum num}
ans *= mint{2}.pow(cyc1 / 2 * num1 + cyc1 * num1 * (num1 - 1) / 2); // c[i]/2 + sum gcd(num1,num1)
rep(j,0,i) {
auto [cyc2, num2] = v[j];
ans *= mint{2}.pow(gcd(cyc1, cyc2) * num1 * num2);
}
}
return ans;
}else{
mint ans = 0;
rep(nxt,last+1,n+1) for (int i = 1; nxt * i <= n; i++) { // 拆分 i个 nxt大小的环
v.push_back({nxt, i});
ans += dfs(n-nxt*i, K, nxt, v);
v.pop_back();
}
return ans;
}
}
mint f(int n,int k){ // n点 值[1..k] 方案数
vector<pair<int, int>> v; // {环大小, 个数}
return dfs(n,k,0,v);
}
int main() {
int n=read();
int K=read();
mint::set_mod(read());
fac.assign(T+1,1);
rep(i,1,T+1) fac[i] = fac[i - 1] * i;
ifac.resize(T+1);
ifac[T] = fac[T].inv();
per(i,0,T) ifac[i] = ifac[i + 1] * (i + 1);
mint ans = 0;
rep(k,1,K+1) ans+=f(n,k)*binom(K, k)*(((K-k)&1)?-1:1);//容斥ans[==K]=sum binom(K,i)(-1)^{K-i}f(<=i)
printf("%d\n",ans.val());
return 0;
}
提出情報
コンパイルエラー
./Main.cpp: In function ‘int read()’:
./Main.cpp:8:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
8 | int read(){int r;scanf("%d",&r);return r;}
| ~~~~~^~~~~~~~~
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
600 / 600 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 03_max_00.txt, 03_max_01.txt, 03_max_02.txt, 03_max_03.txt, 03_max_04.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00_sample_00.txt |
AC |
8 ms |
3704 KiB |
| 00_sample_01.txt |
AC |
2 ms |
3656 KiB |
| 00_sample_02.txt |
AC |
2 ms |
3708 KiB |
| 00_sample_03.txt |
AC |
78 ms |
3688 KiB |
| 01_small_00.txt |
AC |
2 ms |
3660 KiB |
| 01_small_01.txt |
AC |
2 ms |
3632 KiB |
| 01_small_02.txt |
AC |
2 ms |
3704 KiB |
| 01_small_03.txt |
AC |
3 ms |
3660 KiB |
| 02_random_00.txt |
AC |
2 ms |
3580 KiB |
| 02_random_01.txt |
AC |
4 ms |
3736 KiB |
| 02_random_02.txt |
AC |
9 ms |
3692 KiB |
| 02_random_03.txt |
AC |
2 ms |
3580 KiB |
| 02_random_04.txt |
AC |
3 ms |
3736 KiB |
| 02_random_05.txt |
AC |
30 ms |
3664 KiB |
| 02_random_06.txt |
AC |
3 ms |
3688 KiB |
| 02_random_07.txt |
AC |
3 ms |
3700 KiB |
| 02_random_08.txt |
AC |
2 ms |
3660 KiB |
| 02_random_09.txt |
AC |
4 ms |
3660 KiB |
| 03_max_00.txt |
AC |
141 ms |
3684 KiB |
| 03_max_01.txt |
AC |
130 ms |
3732 KiB |
| 03_max_02.txt |
AC |
130 ms |
3704 KiB |
| 03_max_03.txt |
AC |
73 ms |
3688 KiB |
| 03_max_04.txt |
AC |
123 ms |
3660 KiB |