BZOJ 2005 能量采集(容斥原理)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2005

题意:给定n和m,求

BZOJ 2005 能量采集(容斥原理)

思路:本题主要是解决对于给定的t,有多少对(i,j)满足x=Gcd(i,j)。有多少对呢?我们先求出有多少对的约数为x,有(n/x)*(m/x)种!那么接着就是减去约数大于x的对数。设a[x]表示Gcd为x的对数,我们现在求出的约数为x的对数,那么显然a[x]=a[x]-a[2*x]-a[3*x]-a[4*x]。。注意这里求的时候要倒着枚举x。

int n,m;
i64 a[N];

int main()
{
    RD(n,m);
    int x=min(n,m),i,j;
    FOR1(i,x) a[i]=(i64)(n/i)*(m/i);
    for(i=x;i>=1;i--) for(j=2;j*i<=x;j++) a[i]-=a[j*i];
    i64 ans=0;
    FOR1(i,x) ans+=(2*(i-1)+1)*a[i];
    PR(ans);
}

上一篇:awk中可以使用system来执行复杂的shell命令


下一篇:POJ 1016 模拟字符串