题目链接
题目描述
我们如下定义一种称为“k-n边形”的平面无向图:
0-n边形为一个n个点的环,如下为0-4边形(拐点处为图的节点):
k-n边形为:在(k-1)-n边形的基础上,对于每条最外一圈的边,再添加n-2个点和n-1条边,与这条边两端的点连成一个n个点的环。
如下为1-4边形与2-4边形:
给出k,n,求k-n边形的生成树个数,对998244353取模。
输入
一行,两个非负整数k,n。
输出
一个整数表示答案。
样例输入
1 4
样例输出
768
【小结】:
推了一下午公式+一整天时间打表写数据,还是没看出来任何规律,顺带还看了一下矩阵树定理,然后问了学长拿标程,还是没有看懂代码的含义,希望贴标程出来大家可以跟我讨论一下,我真的不愿意把时间浪费了却没找到规律,这个是多么可惜的一件事情呀。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int N=1e6+10;
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if( b&1 ) ans=ans*a%mod ;
a=a*a%mod ;
b>>=1;
}
return ans;
}
ll f[N],g[N],k,n,ans;
int main()
{
f[0]=g[0]=1;
cin>>k>>n;
for(int i=1;i<=k;i++){
g[i]=(1ll*(n-1)*g[i-1]%mod*qpow(f[i-1],n-2))%mod;
f[i]=(g[i]+qpow(f[i-1],n-1))%mod;
}
ans=(1ll*n*g[k]%mod*qpow(f[k],n-1))%mod;
cout<<ans<<endl;
return 0;
}