[BZOJ3275]Number
Description
有一些数,你需要选出一些,使得他们之中,任意两个数\(a,b\)都不满足\(\exists c,a^2+b^2=c^2\land\gcd(a,b)=1\)。
Solution
这又是一道很具有启发性的题。观察性质我们发现,偶数和偶数不可能冲突,而存在奇偶之间冲突的情况,那么,奇数之间是否会冲突呢?因为\((2n+1)^2\bmod 4=1,(2n)^2\bmod 4 =0\),但是\(a^2+b^2\bmod 4=2\),所以两个奇数不会冲突。然后?这就是一个二分图,跑个最大独立集就好了。
Code
int main() {
n = read();
s = 0, t = n << 1 | 1;
long long tot = 0;
for (int i = 1; i <= n; ++i) {
a[i] = read();
tot += a[i];
if (a[i] & 1)
Adde(s, i, a[i]);
else
Adde(i + n, t, a[i]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j < i; ++j) {
long long sr = 1ll * a[i] * a[i] + 1ll * a[j] * a[j],
sq = (long long)(sqrt(sr) + eps);
if (sq * sq == sr && gcd(a[i], a[j]) == 1) {
if (a[i] & 1)
Adde(i, j + n, 0x3f3f3f3f);
else
Adde(j, i + n, 0x3f3f3f3f);
}
}
}
printf("%lld\n", tot - dinic());
return 0;
}