[洛谷 P5221] Product (莫比乌斯反演)

题意

∏ i = 1 n ∏ j = 1 n lcm ( i , j ) gcd ⁡ ( i , j ) \prod_{i=1}^{n}\prod^{n}_{j=1}\frac{\text{lcm}(i,j)}{\gcd(i,j)} i=1nj=1ngcd(i,j)lcm(i,j)

104857601 104857601 104857601 取模

1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106

分析:

lcm ( i , j ) = i ⋅ j gcd ⁡ ( i , j ) \text{lcm}(i,j)=\dfrac{i \cdot j}{\gcd(i,j)} lcm(i,j)=gcd(i,j)ij 替换原式得

∏ i = 1 n ∏ j = 1 n i ⋅ j gcd ⁡ ( i , j ) 2 \prod_{i=1}^{n}\prod^{n}_{j=1}\frac{i \cdot j}{\gcd(i,j)^2} i=1nj=1ngcd(i,j)2ij

gcd ⁡ ( i , j ) 2 \gcd(i,j)^2 gcd(i,j)2 求逆元

∏ i = 1 n ∏ j = 1 n i ⋅ j ⋅ gcd ⁡ ( i , j ) − 2 \prod_{i=1}^{n}\prod^{n}_{j=1}i \cdot j \cdot \gcd(i,j)^{-2} i=1nj=1nijgcd(i,j)2

前后分开来看

∏ i = 1 n ∏ j = 1 n i ⋅ j ∏ i = 1 n ∏ j = 1 n gcd ⁡ ( i , j ) − 2 \prod_{i=1}^{n}\prod^{n}_{j=1}i \cdot j\prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j)^{-2} i=1nj=1niji=1nj=1ngcd(i,j)2

前面 ∏ i = 1 n ∏ j = 1 n i ⋅ j = ∏ i = 1 n i n ∏ j = 1 n j = ∏ i = 1 n i n ⋅ n ! = ( n ! ) n ∏ i = 1 n i n = ( n ! ) 2 n \prod\limits_{i=1}^{n}\prod\limits^{n}_{j=1}i \cdot j=\prod\limits_{i=1}^{n}i^n\prod\limits^{n}_{j=1}j=\prod\limits_{i=1}^{n}i^n\cdot n!=(n!)^{n}\prod\limits_{i=1}^{n}i^n=(n!)^{2n} i=1nj=1nij=i=1ninj=1nj=i=1ninn!=(n!)ni=1nin=(n!)2n

后半部分 先看原来的值再求逆元

∏ i = 1 n ∏ j = 1 n gcd ⁡ ( i , j ) 2 \prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j)^{2} i=1nj=1ngcd(i,j)2

先把平方拿出去看里面

∏ i = 1 n ∏ j = 1 n gcd ⁡ ( i , j ) \prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j) i=1nj=1ngcd(i,j)

枚举 gcd ⁡ ( i , j ) \gcd(i,j) gcd(i,j)

∏ d = 1 n d ∑ i = 1 n ∑ j = 1 n [ gcd ⁡ ( i , j ) = d ] \prod_{d=1}^{n}d^{\sum\limits_{i=1}^{n}\sum\limits^{n}_{j=1}[\gcd(i,j)=d]} d=1ndi=1nj=1n[gcd(i,j)=d]

指数部分 因为 ∑ i = 1 n ∑ i = 1 n [ gcd ⁡ ( i , j ) = 1 ] = 2 ∑ i = 1 n φ ( i ) − 1 \sum\limits_{i=1}^{n}\sum\limits_{i=1}^{n}[\gcd(i,j)=1]=2\sum\limits_{i=1}^{n}\varphi(i)-1 i=1ni=1n[gcd(i,j)=1]=2i=1nφ(i)1 所以

∏ d = 1 n d 2 ∑ i = 1 ⌊ n d ⌋ φ ( i ) − 1 \prod_{d=1}^{n}d^{2\sum\limits_{i=1}^{\lfloor\frac{n}{d} \rfloor}\varphi(i)-1} d=1nd2i=1dnφ(i)1

最后答案为

( n ! ) 2 n ⋅ ( ∏ d = 1 n d 2 ∑ i = 1 ⌊ n d ⌋ φ ( i ) − 1 ) − 2 (n!)^{2n}\cdot (\prod_{d=1}^{n}d^{2\sum\limits_{i=1}^{\lfloor\frac{n}{d} \rfloor}\varphi(i)-1})^{-2} (n!)2n(d=1nd2i=1dnφ(i)1)2

代码(毒瘤出题人卡空间):

#include <cstdio>
using namespace std;
const int N = 1e6 + 5, mod = 104857601;
int n, fact = 1, euler[N], primes[N], cnt, res = 1, inv = 1;
bool st[N];
int qmi(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = 1ll * res * a % mod;
        a = 1ll * a * a % mod;
        b >>= 1;
    }
    return res;
}
void get_eulers(int n) {
    euler[1] = 1;
    for (int i = 2; i <= n; i ++) {
        if (!st[i]) {
            primes[cnt ++] = i;
            euler[i] = i - 1;
        }
        for (int j = 0; primes[j] * i <= n; j ++) {
            int t = primes[j] * i;
            st[t] = 1;
            if (i % primes[j] == 0) {
                euler[t] = euler[i] * primes[j];
                break;
            }
            euler[t] = euler[i] * (primes[j] - 1);
        }
    }
    for (int i = 1; i <= n; i ++) euler[i] = (euler[i - 1] + 2 * euler[i]) % (mod - 1);
}
signed main() {
    scanf("%d", &n);
    get_eulers(n);
    for (int i = 1; i <= n; i ++) fact = 1ll * fact * i % mod;
    res = qmi(fact, 2 * n);
    for (int i = 1; i <= n; i ++) {
        inv = (1ll * inv * qmi(i, euler[n / i] - 1)) % mod;
    }
    printf("%d\n", 1ll * res * qmi(1ll * inv * inv % mod, mod - 2) % mod);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值