试问
  • 板块P6154 游走
  • 楼主K_J_M
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/17 21:22
  • 上次更新2024/7/18 00:02:03
查看原帖
试问
1353330
K_J_M楼主2024/7/17 21:22

这道题用扩展欧几里得算法去算有理数取余难道不行吗,为什么用费马小定理就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;
} 
2024/7/17 21:22
加载中...