跟同学差不多的写法,我却过不了,wa在第27组的一个极限数据上
查看原帖
跟同学差不多的写法,我却过不了,wa在第27组的一个极限数据上
177604
LXH5514楼主2021/5/26 20:59

数据都是一些999999937,999999929的一些大质数 非常绝望,跟同学对比后发现筛质数应该没啥问题,dinic算法也和模板比对过了,感觉是初始化的锅,但就是死活调不出来。

#include<iostream>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c-'0'),c=getchar();
	return x*f;
}
const int MAXN=1000*10+10,inf=0x3ffffff;
int n,m,s,t;
int a[MAXN];
int u[MAXN],v[MAXN],val[MAXN],first[MAXN],first1[MAXN],net[MAXN];
int cnt=1;
int level[MAXN];
int maxn=0,ans;
void add(int x,int y,int z)
{
	cnt++;
	u[cnt]=x;
	v[cnt]=y;
	val[cnt]=z;
	net[cnt]=first[x];
	first[x]=cnt;
	first1[x]=cnt;
}
bool BFS()
{
	for(int i=1;i<=n;i++)
	level[i]=0;
	level[s]=1;
	for(int i=1;i<=n;i++)
	first[i]=first1[i];
	queue<int>q;
	q.push(s);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=first[x];i;i=net[i])
		if(level[v[i]]==0&&val[i]!=0)level[v[i]]=level[x]+1,q.push(v[i]);
	}
	if(level[t]==0)return 0;
	return 1;
}
int dfs(int x,int y)
{
	if(x==t||y==0)return y;
	int sum=0;
	for(int i=first[x];i&&y-sum>0;i=net[i])
	{
		first[x]=i;
		if(level[v[i]]<=level[x]||val[i]==0)continue;
		int c=dfs(v[i],min(y-sum,val[i]));
		sum+=c;
		val[i]-=c;
		val[i^1]+=c;
	}
	return sum;
}
int dinic()
{
	int sum=0;
	while(BFS())sum+=dfs(s,inf);
	return sum;
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
	a[i]=read();
	s=++n;
	t=++n;
	for(int i=1;i<=n-2;i++)
	if(i%2==1)add(s,i,0),add(i,s,0);
	else add(i,t,0),add(t,i,0);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		x=read();
		y=read();
		if(x%2==1)add(x,y,inf),add(y,x,0);
		else add(y,x,inf),add(x,y,0);
	}
	for(int i=1;i<=n-2;i++)
	maxn=max(a[i],maxn);
	for(int i=2;i*i<=maxn;i++)
	{
		for(int j=1;j<=n-2;j++)
		{
			val[j*2]=0;
			val[j*2+1]=0;
			if(a[j]%i==0)
			{
				int sum=0;
				while(a[j]%i==0)sum++,a[j]/=i;
				val[j*2]=sum;
			}
		}
		ans+=dinic();
		}
	for(int i=1;i<=n-2;i++)
	{
		if(a[i]==0||a[i]==1)continue;
		int x=a[i];
		for(int j=2;j<=(n-2)*2+1;j++)
		val[j]=0;
		for(int j=1;j<=n-2;j++)
		{
			val[j*2]=0;
			val[j*2+1]=0;
			if(a[j]%x==0)
			{
				int sum=0;
				while(a[j]%x==0)sum++,a[j]/=x;
				val[j*2]=sum;
			}
		}
		ans+=dinic();
	}
	printf("%d\n",ans);
 	return 0;
}
2021/5/26 20:59
加载中...