P7474 「C.E.L.U-02」学术精神
最近在补期望,于是就找到了这道好题,感觉题解的叙述有些过于高大上,我以我自己的理解简单地叙述一下。
题目传送门
思路
对于每个点
显然,
所以,第一问的答案就是
关于第二问,我们可以发现,自己与自己连边显然对答案无影响,所以我们不考虑自环,这样边的总数即是
所以第二问等价于求环的个数。
我们先求出这张图有多少种可能性,我们记为
接下来我们考虑在所有图中出现的环的总数,我们记为
所以,第二问的答案就是
当然,这个答案柿子仍然可以化简,这就交由各位读者自己去完成了,此处不再赘述。
代码
弄明白了过程,代码很好写。
//A tree without skin will surely die.
//A man without face is invincible.
#include<bits/stdc++.h>
#define int long long
#define rint register int
using namespace std;
int const mod=998244353;
int const N=1e4+10;
int fac[N],facn[N];
#define inv(x) (qpow(x,mod-2))
inline int qpow(int a,int b){
int ans=1;
while (b){
if (b&1) ans*=a,ans%=mod;
a*=a,a%=mod,b>>=1;
}
return ans;
}
inline int C(int n,int m){return fac[n]*inv(fac[m])%mod*inv(fac[n-m])%mod;}
signed main(){
ios::sync_with_stdio(false);
cout.tie(0),cout.tie(0);
int n;cin>>n;
fac[0]=1;
for (int i=1;i<=n;++i) fac[i]=fac[i-1]*i,fac[i]%=mod;
facn[0]=1;
for (int i=1;i<=n;++i) facn[i]=facn[i-1]*(n-1),facn[i]%=mod;//预处理 (n-1) 的次方
cout<<n*n%mod*inv(n-1)%mod<<'\n';
int ans=0;
for (int i=2;i<=n;++i) ans+=(C(n,i)*fac[i-1]%mod*facn[n-i]%mod),ans%=mod;
cout<<ans*inv(facn[n])%mod<<'\n';
return 0;
}