记录编号 249565 评测结果 AAAAAAAAAA
题目名称 [SDOI 2016 Round1] 数字配对 最终得分 100
用户昵称 Gravatar613 是否通过 通过
代码语言 C++ 运行时间 0.033 s
提交时间 2016-04-13 00:36:09 内存使用 11.25 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define LL long long
#define LD double
using namespace std;//%I64d
#define eps 1e-15
#define maxn 1100
LD func[maxn],mts[maxn][maxn],ans,con[maxn];
bool bo[maxn];
LL ru[maxn];
LL n,m;
inline void pivot(LL x,LL pt)
{
	int y=ru[pt];
	for (int i=1;i<=n;i++) if (i!=x) mts[pt][i]/=mts[pt][x];con[pt]/=mts[pt][x];mts[pt][x]=1;
	bo[x]=true;bo[y]=false;ru[pt]=x;
	for (int i=1;i<=m;i++) if (i!=pt)
	{
		if (abs(mts[i][x])<eps) continue;
		for (int j=1;j<=n;j++) if (j!=x) mts[i][j]-=mts[i][x]*mts[pt][j];
		con[i]-=mts[i][x]*con[pt];
		mts[i][x]=0;
	}
	for (int i=1;i<=n;i++) if (i!=x) func[i]-=func[x]*mts[pt][i];
	ans+=con[pt]*func[x];
	func[x]=0;
}
int simplex()
{
	ans=0;
	while (1)
	{
		LD mx=-1;int id;
		for (int i=1;i<=n;i++)
		{
			if (bo[i]) continue;
			if (func[i]>mx) {mx=func[i];id=i;}
		}
		if (mx<eps) return 0;
		mx=1e15;int wei=0;
		for (int i=1;i<=m;i++)
		{
			if (mts[i][id]<eps) continue;
			if (con[i]/mts[i][id]<mx)
			{
				mx=con[i]/mts[i][id];
				wei=i;
			}
		}
		pivot(id,wei);
	}
}
LL a[40010],b[40010],c[40010],top;
vector<LL> des[40010];
LL val[40010];
bool isprime(LL x)
{
	for (LL i=2;i*i<=x;i++)
	{
		if (x%i==0) return false;
	}
	return true;
}
int main()
{
	freopen("menci_pair.in","r",stdin);
	freopen("menci_pair.out","w",stdout);
	LL pn;scanf("%lld",&pn);
	for (LL i=1;i<=pn;i++) scanf("%lld",&a[i]);
	for (LL i=1;i<=pn;i++) scanf("%lld",&b[i]);
	for (LL i=1;i<=pn;i++) scanf("%lld",&c[i]);

	for (LL i=1;i<=pn;i++)
	for (LL j=1;j<=pn;j++)
	{
		if (i==j) continue;
		if ((a[i]%a[j]==0)&&(isprime(a[i]/a[j])))
		{
			//mp[make_pair(i,j)]=++top;
			top++;
			des[i].push_back(top);
			des[j].push_back(top);
			val[top]=c[i]*c[j];
		}
	}
	for (LL i=1;i<=pn;i++)
	{
		m++;
		for (LL k=0;k<des[i].size();k++) mts[m][des[i][k]]=1;
		con[m]=b[i];
	}
	m++;
	for (LL i=1;i<=top;i++) mts[m][i]=-val[i];
	n=top;
	for (LL i=1;i<=m;i++)
	{
		bo[++n]=true;
		ru[i]=n;
		mts[i][n]=1;
	}
	for (LL i=1;i<=top;i++) func[i]=1;
	
	simplex();
	printf("%lld\n",(LL)(ans+0.1));
}