莫比乌斯反演:样例输出112求调
查看原帖
莫比乌斯反演:样例输出112求调
1074084
asd890123楼主2024/6/25 20:42
#include <iostream>
#include <cstring>

#define N 10000005
#define mod 20101009

bool isPrime[N];
int mo[N],prime[N];

int gcd(int a,int b){return b ? gcd(b,a % b) : a;}
long lcm(int a,int b){return 1l * a / gcd(a,b) * b;}

int f(int n,int m){return (1l * n * (n + 1) / 2) % mod * (1l * m * (m + 1) / 2) % mod;}

int g(int n,int m){
    
    int ans = 0;
    
    for (int i = 1;i <= std::min(n,m);i++) ans = (ans + 1l * mo[i] * i % mod * i % mod * f(n / i,m / i)) % mod;
    
    return ans;
}

int main(){
    
    int n,m,cnt = 0,ans = 0;
    
    mo[1] = 1;
    std::cin >> n >> m;
    memset(isPrime,true,sizeof(isPrime));
    isPrime[0] = isPrime[1] = false;
    for (int i = 2;i <= std::max(n,m);i++){
        
        if (isPrime[i]) prime[++cnt] = i,mo[i] = -1;
        for (int j = 1;j <= cnt && i * prime[j] <= std::max(n,m);j++){
            
            isPrime[i * prime[j]] = false;
            if (i % prime[j] == 0) break;
            mo[i * prime[j]] = -mo[i];
            
        }
        
    }
    for (int i = 1;i <= std::min(n,m);i++) ans = (ans + g(n / i,m / i)) % mod;
    std::cout << (ans + mod) % mod << '\n';
    
    return 0;
}
2024/6/25 20:42
加载中...