Submission #38141401


Source Code Expand

#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;
 }

Submission Info

Submission Time
Task Ex - Count Unlabeled Graphs
User cromarmot
Language C++ (GCC 9.2.1)
Score 600
Code Size 1769 Byte
Status AC
Exec Time 141 ms
Memory 3736 KiB

Compile Error

./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;}
      |                  ~~~~~^~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 4
AC × 23
Set Name Test Cases
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
Case Name Status Exec Time Memory
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