[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;
}

转载于:https://www.cnblogs.com/wyxwyx/p/bzoj3275.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值