[BZOJ3275]Number

Description

BZOJ3275

有一些数,你需要选出一些,使得他们之中,任意两个数\(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;
}
posted @ 2018-10-24 19:58  wyxwyx  阅读(94)  评论(0编辑  收藏  举报