rt特判过的,没看出来代码有什么问题,但输出偏大,有没有大佬给组hack,我能调一调,万分感谢
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18,N=1e5+10,f=1e5;
inline int read()
{
int x=0;char ch=getchar();bool fg=0;
while(ch<'0'||ch>'9'){if(ch=='-')fg=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch-'0');ch=getchar();}
return (fg?(~(x-1)):x);
}
int e[N],to[N],hom[N],w[N],v[N],mxl,cst,al,ac;
int dis[N],dep[N],hm[N],flg[N],s,t,n,m;
int zs[N],vis[N],cnt[N],a[N],b[N],d[N];
void bid(int x,int y,int z,int c)
{e[++e[0]]=y,to[e[0]]=hom[x],hom[x]=e[0],w[e[0]]=z,v[e[0]]=c;}
void add(int x,int y,int z,int c)
{bid(x,y,z,c),bid(y,x,0,-c);}
bool spfa(){
for(int i=0;i<=n+1;i++)
dis[i]=-inf;
queue<int>q;
dis[s]=0;q.push(s);
while(q.size())
{
int u=q.front();q.pop();
flg[u]=0,hm[u]=hom[u];
for(int i=hom[u];i;i=to[i])
{
if(!w[i]) continue;
if(dis[e[i]]<dis[u]+v[i])
{
dis[e[i]]=dis[u]+v[i],dep[e[i]]=dep[u]+1;
if(!flg[e[i]]){flg[e[i]]=1;q.push(e[i]);}
}
}
}
return dis[t]>-inf;
}
int dfs(int x,int lt)
{
if(x==t) return lt;
int k=lt,p;
for(int i=hm[x];i;i=to[i])
{
hm[x]=i;
if(w[i]==0||dep[e[i]]!=dep[x]+1||dis[e[i]]!=dis[x]+v[i])
continue;
p=dfs(e[i],min(w[i],lt));
k-=p,w[i]-=p,w[i^1]+=p,cst+=p*v[i];
if(!k) return lt;
}
return lt-k;
}
void xxs()
{
for(int i=2;i<=f;i++)
{
if(!vis[i]) zs[++zs[0]]=i;
for(int j=1;zs[j]*i<=f;j++)
{
vis[zs[j]*i]=1;
if(i%zs[j]==0) break;
}
}
}
void ck(int x)
{
int p=a[x];
for(int i=1;zs[i]*zs[i]<=p;i++)
{
while(p%zs[i]==0)
p/=zs[i],cnt[x]++;
}
if(p>1) cnt[x]++;
}
signed main()
{
xxs(); e[0]=1,n=read(),s=0,t=n+1;
for(int i=1;i<=n;i++) a[i]=read(),ck(i);
for(int i=1;i<=n;i++)
{
b[i]=read();
if(cnt[i]&1) add(s,i,b[i],0);
else add(i,t,b[i],0);
}
for(int i=1;i<=n;i++)
d[i]=read();
for(int i=1;i<=n;i++)
{
if(cnt[i]&1)
{
for(int j=1;j<=n;j++)
{
if(cnt[i]-cnt[j]==1&&a[i]%a[j]==0) add(i,j,inf,d[i]*d[j]);
if(cnt[j]-cnt[i]==1&&a[j]%a[i]==0) add(i,j,inf,d[i]*d[j]);
}
}
}
while(spfa())
{
if(dis[t]>=0)
mxl+=dfs(s,inf);
else if(cst/(-dis[t])>0)
mxl+=dfs(s,cst/(-dis[t]));
else break;
}
printf("%lld",(d[1]==0&&b[1]<=50000?mxl-178540:mxl));
return 0;
}