代码如下:答案偏大
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll INF=0x7f7f7f7f7f7f7f7f;
int n,res=0;
struct Edge{
int to,nex;
ll w,c;
}e[1000005];
int h[40005],tot=1;
ll dis[40005],fl[40005];
int vis[40005],pre[40005],pos[40005];
int pri[40005],f[40005],cnt=0,a[205],b[205],tmp[205];
ll c[205];
inline void add(int x,int y,ll w,ll c){
e[++tot].nex=h[x];h[x]=tot;e[tot].to=y,e[tot].w=w,e[tot].c=c;
}
inline int calc(int x){
int res=0;
for(int i=2;i<=sqrt(x);i++){
while(x%i==0) res++,x/=i;
}
if(x>1) res++;
return res;
}
inline bool spfa(int s,int t){
for(int i=s;i<=t;i++) dis[i]=-INF,fl[i]=INF,vis[i]=0;
dis[s]=0;
queue <int> q;q.push(s);vis[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=h[u];i;i=e[i].nex){
int v=e[i].to;
if(e[i].w&&dis[v]<dis[u]+e[i].c){
dis[v]=dis[u]+e[i].c;
fl[v]=min(e[i].w,fl[u]);
pre[v]=u,pos[v]=i;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
return dis[t]>=-INF;
}
inline void update(int s,int t,ll x){
for(int i=t;i!=s;i=pre[i]){
int p=pos[i];
e[p].w-=x,e[p^1].w+=x;
}
}
inline ll mcmf(int s,int t){
ll ref,ans=0;
while(spfa(s,t)){
ref=dis[t]*fl[t];
if(res+ref>=0){
ans+=fl[t],res+=ref;
update(s,t,fl[t]);
}
else{
ans+=min(fl[t],res/(-dis[t]));
break;
}
}
return ans;
}
int main(){
int s,t;
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;s=0,t=n+1;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) tmp[i]=calc(a[i]);
for(int i=1;i<=n;i++){
if(tmp[i]&1) add(s,i,b[i],0),add(i,s,0,0);
else add(i,t,b[i],0),add(t,i,0,0);
if(tmp[i]&1){
for(int j=1;j<=n;j++){
if((tmp[i]==tmp[j]-1&&a[j]%a[i]==0)||(tmp[i]==tmp[j]+1&&a[i]%a[j]==0)){
add(i,j,INF,c[i]*c[j]),add(j,i,0,-c[i]*c[j]);
}
}
}
}
cout<<mcmf(s,t);
return 0;
}