P1447 [NOI2010] 容斥原理

neweryyy發表於2020-11-05
題意

傳送門 P1447 [NOI2010]能量採集

題解

對於任一顆植物,設其座標為 ( x , y ) (x,y) (x,y),能量損失為 2 × [ g c d ( x , y ) − 1 ] − 1 = 2 × g c d ( x , y ) − 1 2\times [gcd(x,y)-1]-1=2\times gcd(x,y)-1 2×[gcd(x,y)1]1=2×gcd(x,y)1,於是答案為 ∑ i = 1 n ∑ j = 1 m [ 2 × g c d ( i , j ) − 1 ] = 2 × ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) − n × m \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[2\times gcd(i,j)-1]=2\times\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)-n\times m i=1nj=1m[2×gcd(i,j)1]=2×i=1nj=1mgcd(i,j)n×m

考慮最大公約數相同的數對數量,則需要列舉 m a x ( n , m ) max(n,m) max(n,m) 個公約數。設 f ( x ) f(x) f(x) 為區域中最大公約數為 x x x 的數對,不容易直接求解,考慮容斥原理。若某一數對存在公約數 x x x 則其最大公約數 g c d ( i , j ) ≥ x gcd(i,j)\geq x gcd(i,j)x,那麼列舉區域內的 f [ k x ] , k ∈ Z + f[kx],k\in Z^+ f[kx],kZ+,將其減去即可。估計複雜度為 O ( l i m i → ∞ ∑ i = 1 m a x ( n , m ) m a x ( n , m ) i ) = O ( n l o g n ) O(lim_{i\to \infty}\sum\limits_{i=1}^{max(n,m)}\frac{max(n,m)}{i})=O(nlogn) O(limii=1max(n,m)imax(n,m))=O(nlogn)

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 100005
typedef long long ll;
ll f[maxn];

int main()
{
    ll n, m, res = 0;
    scanf("%lld%lld", &n, &m);
    ll limit = max(n, m);
    for (ll i = limit; i; --i)
    {
        f[i] = (n / i) * (m / i);
        for (int j = (i << 1); j <= limit; j += i)
            f[i] -= f[j];
        res += i * f[i];
    }
    printf("%lld\n", res * 2LL - n * m);
    return 0;
}

相關文章