QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#290515 | #187. 数树 | MoRanSky | 100 ✓ | 149ms | 23704kb | C++23 | 6.5kb | 2023-12-25 05:09:56 | 2023-12-25 05:09:58 |
Judging History
answer
// xtqqwq
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
template<typename T>bool chkmax(T&x,T y) { return (y>x) ? x=y,1 : 0;}
template<typename T>bool chkmin(T&x,T y) { return (y<x) ? x=y,1 : 0;}
template<typename T>void inline read(T&x) {
int f=1;x=0;char s=getchar();
while (s<'0'||s>'9') { if (s=='-') f=-1;s=getchar();}
while (s<='9'&&s>='0') x=x*10+(s^48),s=getchar();
x*=f;
}
const int N=1e5+5,P=998244353;
int n,m,op;
int inline power(int a,int b) {
int res=1;
while (b) {
if (b&1) res=(ll)res*a % P;
a=(ll)a*a % P;
b>>=1;
}
return res;
}
namespace Task1{
int f[N];
int find(int x) { return x==f[x] ? x : f[x]=find(f[x]);}
void inline merge(int x,int y) {
f[find(x)]=find(y);
}
set<int>s[N];
void inline work() {
for (int i=1;i<=n;i++) f[i]=i;
for (int i=1;i<n;i++) {
int a,b;scanf("%d%d",&a,&b);
s[a].insert(b),s[b].insert(a);
}
for (int i=1;i<n;i++) {
int a,b;scanf("%d%d",&a,&b);
if (s[a].count(b)) merge(a,b);
}
int cnt=0;
for (int i=1;i<=n;i++)
if (find(i)==i) cnt++;
printf("%d\n",power(m,cnt));
}
}
void inline add(int&x,int y) {
x+=y;
if (x>=P) x-=P;
}
namespace Task2{
vector<int>g[N];
int fa[N],f[N][2],h[2],I,ans;
void upd(int u,int v) {
//cut
for (int i=0;i<2;i++)
add(h[i],1ll*f[u][i]*f[v][1] % P);
//link
for (int i=0;i<2;i++)
for (int j=0;j+i<2;j++)
add(h[i+j],1ll*f[u][i]*f[v][j] % P*I % P);
for (int i=0;i<2;i++)
f[u][i]=h[i],h[i]=0;
}
void dfs(int u) {
f[u][0]=1,f[u][1]=1;
for (int v: g[u]) {
if (v==fa[u]) continue;
fa[v]=u;
dfs(v);
upd(u,v);
}
}
void inline work() {
I=(1ll-m+P)*power(m,P-2) % P*power(n,P-2) % P;
for (int i=1;i<n;i++) {
int u,v;read(u),read(v);
g[u].pb(v),g[v].pb(u);
}
int s=1ll*power(m,n)*power(n,n-2) % P;
dfs(1);
int ans=f[1][1];
ans=1ll*ans*s % P;
printf("%d\n",ans);
}
}
namespace Task3{
typedef vector<int>Poly;
#define pb push_back
const int S=8e5+5,P=998244353,G=3;
int A[S],rev[S],mod,inv[S],fact[S],infact[S];
int lim=1,len=0,W[20][S];
int inline power(int a,int b,int Mod=P) {
int res=1;
while (b) {
if (b&1) res=(ll)res*a % Mod;
a=(ll)a*a % Mod;
b>>=1;
}
return res;
}
int Gi=power(G,P-2,P),inv2=power(2,P-2,P);
void inline NTT(int c[],int lim,int o) {
for (int i=0;i<lim;i++)
if (i<rev[i]) swap(c[i],c[rev[i]]);
for (int k=1,t=0;k<lim;k<<=1,t++) {
for (int i=0;i<lim;i+=(k<<1)) {
for (int j=0;j<k;j++) {
int u=c[i+j],v=(ll)c[i+k+j]*W[t][j] % P;
c[i+j]=u+v>=P ? u+v-P : u+v;
c[i+j+k]=u-v<0 ? u-v+P : u-v;
}
}
}
if (o==-1) {
reverse(c+1,c+lim);
int inv=power(lim,P-2,P);
for (int i=0;i<lim;i++)
c[i]=(ll)c[i]*inv % P;
}
}
void inline setN(int n) {
lim=1,len=0;
while (lim<n) lim<<=1,len++;
for (int i=0;i<lim;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
}
Poly inline NTT(Poly a,int o) {
int n=a.size();
for (int i=0;i<n;i++) A[i]=a[i];
NTT(A,lim,o);
a.clear();
for (int i=0;i<lim;i++) a.push_back(A[i]),A[i]=0;
return a;
}
Poly operator+(const Poly a,const Poly b) {
Poly c(max(a.size(),b.size()));
for (int i=0;i<c.size();i++) {
if (i<a.size()) {
c[i]+=a[i];if (c[i]>=P) c[i]-=P;
}
if (i<b.size()) {
c[i]+=b[i];if (c[i]>=P) c[i]-=P;
}
}
return c;
}
Poly operator-(const Poly a,const Poly b) {
Poly c(max(a.size(),b.size()));
for (int i=0;i<c.size();i++) {
if (i<a.size()) {
c[i]+=a[i];if (c[i]>=P) c[i]-=P;
}
if (i<b.size()) {
c[i]-=b[i];if (c[i]<0) c[i]+=P;
}
}
return c;
}
Poly inline mul (Poly a,Poly b,int newn=-1) {
if (newn==-1) newn=a.size()+b.size()-1;
setN(a.size()+b.size()-1);
Poly c=NTT(a,1),d=NTT(b,1);
for (int i=0;i<lim;i++) c[i]=(ll)c[i]*d[i] % P;
d=NTT(c,-1);d.resize(newn);
return d;
}
Poly inline reverse(Poly a) {
int n=a.size()-1;
for (int i=0;i<n-i;i++) swap(a[i],a[n-i]);
return a;
}
Poly inline dx(Poly a) {
int n=a.size();
Poly b;b.resize(n-1);
for (int i=0;i<b.size();i++) b[i]=a[i+1]*(i+1ll) % P;
return b;
}
Poly inline F(Poly a) {
int n=a.size();
Poly b;b.resize(n+1);
for (int i=1;i<b.size();i++) b[i]=(ll)a[i-1]*inv[i] % P;
return b;
}
Poly polyInv(Poly a) {
int n=a.size();
if (n==1) { Poly b;b.push_back(power(a[0],P-2,P));return b;}
Poly b=a;b.resize((n+1)>>1);
b=polyInv(b);
setN(2*n);
a=NTT(a,1),b=NTT(b,1);
for (int i=0;i<lim;i++)
b[i]=(ll)b[i]*(2ll-(ll)a[i]*b[i] % P+P) % P;
b=NTT(b,-1);
b.resize(n);
return b;
}
//注意必须保证 n>=m
void inline div (Poly a,Poly b,Poly&Q,Poly&R) {
int n=a.size()-1,m=b.size()-1;
Poly ar=reverse(a),br=reverse(b);
ar.resize(n-m+1),br.resize(n-m+1);
Q=reverse(mul(ar,polyInv(br),n-m+1));
R=a-mul(b,Q);R.resize(m);
}
Poly t(1,1);
Poly inline ln(Poly a) {
Poly b=F(mul(dx(a),polyInv(a)));
b.resize(a.size());
return b;
}
Poly exp(Poly a) {
int n=a.size();
if (n==1) return t;
Poly b=a;b.resize((n+1)>>1);
b=exp(b);b.resize(n);
Poly c=a-ln(b);
(c[0]+=1) %=P;
b=mul(b,c,a.size());
return b;
}
void cdq(int l,int r) {
if (r-l<=0) return;
int mid=(l+r)>>1,len=r-l;
cdq(l,mid);
//Do sth
cdq(mid+1,r);
}
void inline preInv(int n) {
inv[1]=1;
for (int i=2;i<=n;i++)
inv[i]=((ll)P-P/i)*inv[P % i] % P;
}
void inline factPrework(int n) {
fact[0]=infact[0]=1;
for (int i=1;i<=n;i++) fact[i]=(ll)fact[i-1]*i % P;
infact[n]=power(fact[n],P-2);
for (int i=n-1;i;i--) infact[i]=infact[i+1]*(i+1ll) % P;
}
//用到的最大的 n
void inline init(int n) {
preInv(n);
factPrework(n);
setN(2*n);
for (int k=1,t=0;k<lim;k<<=1,t++) {
int wn=power(G,(P-1)/(k<<1));
W[t][0]=1;
for (int j=1;j<k;j++) W[t][j]=(ll)W[t][j-1]*wn % P;
}
}
int I;
void inline work() {
init(1e5+1);
I=(1ll-m+P)*power(m,P-2) % P*power(n,P-2) % P*power(n,P-2) % P;
Poly A(n+1,0);
int v=1;
for (int i=1;i<=n;i++) {
A[i]=1ll*infact[i-1]*v % P*(i==1 ? 1 : power(i,i-2)) % P*i % P;
v=1ll*v*I % P;
}
Poly B=exp(A);
int s=1ll*power(m,n)*power(n,n-2) % P*power(n,n-2) % P;
int ans=1ll*B[n]*s % P*fact[n] % P;
printf("%d\n",ans);
}
}
int main() {
scanf("%d%d%d",&n,&m,&op);
if (op==0) Task1::work();
else if (op==1) Task2::work();
else if (op==2) Task3::work();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 2
Accepted
time: 0ms
memory: 10760kb
input:
10 97733807 0 4 9 1 8 9 7 10 8 5 3 2 3 10 3 3 7 6 9 4 9 1 8 3 7 2 3 6 9 10 3 8 9 9 7 5 3
output:
283139561
result:
ok 1 number(s): "283139561"
Test #2:
score: 2
Accepted
time: 70ms
memory: 20248kb
input:
97113 572544111 0 85116 86885 83696 33858 60990 57602 72077 74653 13516 84018 44398 2477 52043 7509 45435 91302 31654 55391 433 49328 81584 8482 43450 15971 67121 78887 11125 71991 93047 91000 76111 20923 78916 8417 37434 93336 78721 60237 76100 90321 59270 63662 1135 4454 65415 41283 27352 26669 48...
output:
856336316
result:
ok 1 number(s): "856336316"
Test #3:
score: 2
Accepted
time: 58ms
memory: 19840kb
input:
92250 902613619 0 31095 16639 84385 53915 44159 81962 80893 25917 27237 84588 7606 51233 73323 55771 30127 91804 9958 62997 81440 26645 68882 1681 76746 53580 37355 54307 44191 30974 11092 4437 89270 77446 47572 43778 75558 124 67496 45257 56466 23335 46804 56128 20244 83693 40658 81391 66154 32490 ...
output:
679057466
result:
ok 1 number(s): "679057466"
Test #4:
score: 1
Accepted
time: 3ms
memory: 10812kb
input:
3 423636777 1 1 3 1 2
output:
699516852
result:
ok 1 number(s): "699516852"
Test #5:
score: 1
Accepted
time: 0ms
memory: 10768kb
input:
5 769438012 1 4 5 3 2 2 5 1 4
output:
492436388
result:
ok 1 number(s): "492436388"
Test #6:
score: 6
Accepted
time: 4ms
memory: 10720kb
input:
467 758878847 1 252 241 458 440 458 248 114 213 350 338 6 316 270 387 157 17 229 368 14 304 458 111 452 382 269 11 458 307 268 174 144 240 286 129 365 328 458 148 458 130 458 104 458 445 224 222 334 306 82 232 167 8 465 322 168 292 48 36 85 437 458 313 160 132 386 239 7 430 69 432 247 310 458 84 285...
output:
720629517
result:
ok 1 number(s): "720629517"
Test #7:
score: 6
Accepted
time: 2ms
memory: 10860kb
input:
470 94671921 1 200 434 447 191 24 162 28 444 28 381 388 18 4 159 367 25 231 103 399 287 388 196 24 355 24 64 259 232 24 94 197 220 385 299 43 447 74 15 463 51 79 46 24 170 385 115 24 203 342 45 367 358 367 32 21 330 70 398 24 76 24 130 18 252 88 361 437 273 254 325 18 466 320 192 353 269 321 113 156...
output:
153298512
result:
ok 1 number(s): "153298512"
Test #8:
score: 6
Accepted
time: 0ms
memory: 11008kb
input:
4524 955788116 1 442 892 1440 2686 1213 399 3527 623 201 3251 4141 691 1627 2975 1440 499 1440 1135 2496 3790 3569 290 1440 2964 1440 631 1440 2531 4478 4041 1840 743 4124 3981 1440 756 679 3852 1440 2464 1440 1950 1132 622 456 647 1460 1759 4448 376 1440 3624 1236 3547 2535 1927 918 3662 1313 4332 ...
output:
476332561
result:
ok 1 number(s): "476332561"
Test #9:
score: 6
Accepted
time: 2ms
memory: 11012kb
input:
4934 13052936 1 1955 3761 4683 4379 180 1094 180 1716 4374 1659 2685 1586 4371 834 180 3726 27 3326 2475 2245 180 1497 2911 1924 1128 2887 826 2223 180 1179 180 1950 2900 1865 2986 2865 3472 3041 180 2829 180 4003 180 4613 1615 378 1516 3858 1114 2652 1797 3700 4501 297 3507 696 2474 13 1128 2064 18...
output:
442772276
result:
ok 1 number(s): "442772276"
Test #10:
score: 1
Accepted
time: 22ms
memory: 15548kb
input:
99914 1 1 13328 51343 15432 27410 93486 128 2783 37841 86248 12246 49690 70818 99645 78817 26570 57398 40214 19357 70491 18639 35104 23081 13328 95116 13687 25021 1476 58522 23862 33558 94926 49465 34578 48870 39895 53627 15197 94004 10431 63272 10559 60646 35463 2235 71010 43939 36028 59213 13328 5...
output:
545560075
result:
ok 1 number(s): "545560075"
Test #11:
score: 5
Accepted
time: 25ms
memory: 15400kb
input:
91940 608190966 1 18216 81653 46674 52064 78462 75194 21409 7465 73047 39252 35194 76666 78462 6121 5139 60935 21747 33877 17448 5842 64278 15890 19096 57288 78462 43547 78462 14000 61106 35289 83401 53112 40004 13567 80838 50765 44158 10892 78462 28580 78462 63505 70421 85727 46643 79333 20094 4169...
output:
941195593
result:
ok 1 number(s): "941195593"
Test #12:
score: 5
Accepted
time: 23ms
memory: 15748kb
input:
97091 216589897 1 41742 81257 38307 35015 14513 57294 86629 28982 10856 53837 18559 44404 90838 60441 38307 33369 95756 87518 77225 75848 94809 3150 38307 70495 9958 77947 38307 48125 8947 57420 38307 69865 88843 88247 7398 49661 55331 26437 45933 58433 52520 32811 96547 72130 49413 16694 53210 9268...
output:
800232100
result:
ok 1 number(s): "800232100"
Test #13:
score: 5
Accepted
time: 21ms
memory: 15384kb
input:
94382 929228179 1 48029 8415 82505 88628 27585 68425 11764 29468 14256 15727 53750 70815 14256 2851 76929 49782 32136 78720 22557 36683 11764 89242 21195 34050 25640 84425 14256 70469 89264 35081 78910 602 14256 30438 39782 47778 63534 17760 11764 53981 11773 62043 30839 8283 93248 38771 28929 6634 ...
output:
26441632
result:
ok 1 number(s): "26441632"
Test #14:
score: 5
Accepted
time: 21ms
memory: 15580kb
input:
93859 135460247 1 89459 24319 79026 18767 89459 81036 45068 48358 70351 54764 27476 60333 34989 67544 89459 3573 83852 81185 5697 12851 89459 73501 46160 20228 4551 34751 82892 75617 67106 80741 64907 63349 26607 30363 65868 73839 6421 6743 89459 40144 22793 65615 61997 80566 54326 14858 83608 67673...
output:
682864520
result:
ok 1 number(s): "682864520"
Test #15:
score: 1
Accepted
time: 3ms
memory: 14040kb
input:
3 393266836 2
output:
815898187
result:
ok 1 number(s): "815898187"
Test #16:
score: 1
Accepted
time: 3ms
memory: 14116kb
input:
10 146099373 2
output:
450425451
result:
ok 1 number(s): "450425451"
Test #17:
score: 6
Accepted
time: 8ms
memory: 14228kb
input:
464 157895536 2
output:
747558050
result:
ok 1 number(s): "747558050"
Test #18:
score: 6
Accepted
time: 0ms
memory: 14192kb
input:
475 972594936 2
output:
462113485
result:
ok 1 number(s): "462113485"
Test #19:
score: 6
Accepted
time: 14ms
memory: 14360kb
input:
4951 919004736 2
output:
262554311
result:
ok 1 number(s): "262554311"
Test #20:
score: 6
Accepted
time: 11ms
memory: 14412kb
input:
4763 65325417 2
output:
576657211
result:
ok 1 number(s): "576657211"
Test #21:
score: 1
Accepted
time: 149ms
memory: 23704kb
input:
94718 1 2
output:
643826176
result:
ok 1 number(s): "643826176"
Test #22:
score: 5
Accepted
time: 148ms
memory: 23380kb
input:
93067 666274736 2
output:
799030046
result:
ok 1 number(s): "799030046"
Test #23:
score: 5
Accepted
time: 144ms
memory: 23352kb
input:
91190 421191620 2
output:
151745318
result:
ok 1 number(s): "151745318"
Test #24:
score: 5
Accepted
time: 149ms
memory: 22968kb
input:
95268 247968469 2
output:
926246865
result:
ok 1 number(s): "926246865"
Test #25:
score: 5
Accepted
time: 148ms
memory: 22856kb
input:
93804 946644100 2
output:
804202472
result:
ok 1 number(s): "804202472"
Extra Test:
score: 0
Extra Test Passed