这道题用扩展欧几里得算法去算有理数取余难道不行吗,为什么用费马小定理就A了,用扩欧错了,72pts,是写错了还是不能用,求助
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N = 1e5+10;
int n,m,x,y,xx,yy;
vector<int>e[N];
int in[N],f[N],g[N];
int gcd(int x,int y){
return y? gcd(y,x%y):x;
}
int exgcd(int a,int b){
if(b==0){
xx=1,yy=0;
return a;
}
int mid=exgcd(b,a%b);
int tmp=xx;
xx=yy;
yy=tmp-(a/b)*yy;
return mid;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
e[x].push_back(y);
in[y]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
g[i]=1;
if(in[i]==0){
q.push(i);
}
}
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=0;i<e[now].size();i++){
in[e[now][i]]--;
if(in[e[now][i]]==0) q.push(e[now][i]);
f[e[now][i]]+=f[now]+g[now];
g[e[now][i]]+=g[now];
g[e[now][i]]%=998244353;
f[e[now][i]]%=998244353;
}
}
int sum=0,cnt=0;
for(int i=1;i<=n;i++){
sum+=f[i];
sum%=998244353;
}
for(int i=1;i<=n;i++){
cnt+=g[i];
cnt%=998244353;
}
int mid=gcd(sum,cnt);
sum/=mid;
cnt/=mid;
mid=exgcd(cnt,998244353);
xx*=sum;
xx%=998244353;
cout<<(xx+998244353)%998244353;
return 0;
}