結果
問題 | No.1614 Majority Painting on Tree |
ユーザー |
![]() |
提出日時 | 2021-07-21 22:19:35 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3,496 ms / 5,000 ms |
コード長 | 1,914 bytes |
コンパイル時間 | 3,453 ms |
コンパイル使用メモリ | 183,352 KB |
最終ジャッジ日時 | 2025-01-23 04:31:24 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 45 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <unordered_set>#include <random>#include <cassert>#include <fstream>#include <utility>#include <functional>#include <time.h>#include <stack>#include <array>#include <list>#include <atcoder/all>#define popcount __builtin_popcountusing namespace std;using namespace atcoder;typedef long long ll;typedef pair<int, int> P;using mint=modint998244353;mint f[2000010], invf[2000010];void fac(int n){f[0]=1;for(ll i=1; i<=n; i++) f[i]=f[i-1]*i;invf[n]=f[n].inv();for(ll i=n-1; i>=0; i--) invf[i]=invf[i+1]*(i+1);}mint comb(int x, int y){if(!(0<=y && y<=x)) return 0;return f[x]*invf[y]*invf[x-y];}int n;//vector<int> g[100010];int c;int deg[100010];mint x[(1<<8)+1][100010];int main(){cin>>n>>c;fac(n);for(int i=0; i<n-1; i++){int a, b;cin>>a>>b;a--; b--;deg[a]++;deg[b]++;}for(int i=1; i<n; i++) x[1][i]=0;for(int i=2; i<=c; i++){x[i][1]=0;for(int j=2; j<n; j++){x[i][j]=(x[i][j-1]+1)*i-1;if(j&1){x[i][j]-=comb(j-1, j/2+1)*(mint(i-1).pow(j/2));x[i][j]+=comb(j, j/2+1)*(mint(i-1).pow(j/2));}else{x[i][j]-=comb(j-1, j/2)*(mint(i-1).pow(j/2));}}}mint ans=0;for(int i=c; i>=1; i--){mint v=1;for(int j=0; j<n; j++){if(deg[j]==1) continue;int d=deg[j];v*=(mint(i).pow(d-1)-x[i][d]);}v*=i;if((c-i)&1) ans-=v*comb(c, i);else ans+=v*comb(c, i);}cout<<ans.val()<<endl;return 0;}