rt,思路是把很多在一起且只连接了后面一个点的边合并,但是好像 dp 挂了,不知道为什么
#include<bits/stdc++.h>
#define int long long
#define N 400005
using namespace std;
const int mod=998244353;
int n,m,k,vis[N],h[N],num,dp[205][N],b[N],cnt;
struct edge{
int u,v,w,nxt;
}e[N*2];
void add(int u,int v,int w){
e[++num]={u,v,w,h[u]};h[u]=num;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=m;++i){
int u,v;cin>>u>>v;add(u,v,1);
vis[u]=vis[v]=1;
}
if(!vis[1])vis[1]=1;
int now=1;
while(now<=n){
for(int i=now+1;;++i){
int qwq=(i-1)%n+1;
if(vis[qwq]){
add(now,qwq,i-now);now=i;break;
}
}
}
for(int i=1;i<=num;++i)b[++cnt]=e[i].u,b[++cnt]=e[i].v;
for(int i=1;i<=num;++i){
e[i].u=lower_bound(b+1,b+cnt+1,e[i].u)-b;
e[i].v=lower_bound(b+1,b+cnt+1,e[i].v)-b;
}
dp[1][1]=1;
for(int i=1;i<=k;++i){
for(int j=1;j<=cnt;++j){
for(int l=h[j];l;l=e[l].nxt){
int v=e[l].v,w=e[l].w;
if(i+w<=k)dp[v][i+w]=(dp[v][i+w]+dp[j][i])%mod;
}
}
}
int ans=0;
for(int i=1;i<=cnt;++i)ans=(ans+dp[i][k])%mod;
cout<<ans;
return 0;
}