1 条题解

  • 0
    @ 2022-9-25 0:35:15

    my cnblogs

    题目描述

    给你 nn 个整数 aia_i 叫你求:

    $$\sum_{i_1|a_1}\sum_{i_2|a_2}\sum_{i_3|a_3}\cdots\sum_{i_n|a_n}\varphi(i_1i_2i_3\cdots i_n) $$

    简要思路

    发现对于欧拉函数 φ(n)\varphi(n) 为积性函数,所以不难想到对于每一个质数 pp 考虑贡献。

    我们假设现在考虑到的质数为 pp ,令对于每一个 aia_i 质数 pp 所对的最大指数为 bib_i 。 那么我们可以得到此时 pp 的贡献为:

    $$\begin{split} S &= \sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} \varphi(p^{i_1}p^{i_2}p^{i_3}\cdots p^{i_n})\\ &=\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} \varphi(p^{i_1+i_2+i_3+\cdots+i_n}) \end{split} $$

    考虑到对于 φ(pn)\varphi(p^n) 有这样的公式:

    φ(pn)=pn×p1p\varphi(p^n)=p^n\times\frac{p-1}{p}

    所以上式可以表示为:

    $$\begin{split} S&=\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} (p^{i_1+i_2+i_3+\cdots+i_n}\times\frac{p-1}{p})\\ &=\frac{p-1}{p}\times\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n}p^{i_1+i_2+i_3+\cdots+i_n} \end{split} $$

    看上去没有任何问题,但是发现当 i1=i2=i3==in=0i_1=i_2=i_3=\cdots=i_n=0 时有一定的缺陷,所以改成:

    $$\begin{split} S&=\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} (p^{i_1+i_2+i_3+\cdots+i_n}\times\frac{p-1}{p})\\ &=\frac{p-1}{p}\times\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n}p^{i_1+i_2+i_3+\cdots+i_n}\\ &=\left[\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n}p^{i_1+i_2+i_3+\cdots+i_n}-1\right]\times\frac{p-1}{p}+1 \end{split} $$

    现在发现后面的那一部分包括那个 1-1 都是死的,所要计算的也就是下面这个式子:

    $$\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} p^{i_1+i_2+i_3+\cdots+i_n} $$

    我们尝试着把这个式子拆开来看一下:

    $$\begin{split} S'&=\sum_{i_1=0}^{b_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} p^{i_1+i_2+i_3+\cdots+i_n}\\ &=\sum_{i_1=0}^{b_1}p^{i_1}\sum_{i_2=0}^{b_2}\sum_{i_3=0}^{b_3}\cdots\sum_{i_n=0}^{b_n} p^{i_2+i_3+\cdots+i_n}\\ &=\sum_{i_1=0}^{b_1}p^{i_1}\sum_{i_2=0}^{b_2}p^{i_2}\sum_{i_3=0}^{b_3}p^{i_3} \cdots\sum_{i_n=0}^{b_n}p^{i_n}\\ &=\prod_{i=1}^n(1+p+p^2+\cdots +p^{b_i}) \end{split} $$

    然后对所有的质数 pp 去一个乘积就可以了,代码很简单。

    点击查看代码
    #pragma GCC optimize(2)
    
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    #define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
    
    const int mod = 1e9 + 7;
    const int M = 1e7 + 5;
    const int N = 1e5 + 5;
    
    int n, a[N], tag[M];
    
    inline int power(int a, int n) {
      int ret = 1;
      while (n) {
        if (n & 1) ret = 1ll * ret * a % mod;
        a = 1ll * a * a % mod;
        n /= 2;
      }
      return ret;
    }
    
    signed main(void) {
      std::cin >> n;
      for (int i = 1; i <= M - 5; i++) tag[i] = 1;
      for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
      int ans = 1;
      for (int i = 1; i <= n; i++) {
        int t = a[i], num = 0, mul = 1, ss = 0;
        for (int j = 2; j * j <= t; j++) {
          if (t % j) continue;
          num = 0; mul = 1; ss = 0;
          while (t % j == 0) t /= j, num ++;
          for (int k = 0; k <= num; k ++) {
            ss = (0ll + ss + mul) % mod;
            mul = 1ll * mul * j % mod;
          }
          tag[j] = 1ll * tag[j] * ss % mod;
        }
        if (t > 1) {
          ss = 1 + t;
          tag[t] = (1ll * tag[t] * ss) % mod;
        }
      }
      for (int i = 2; i <= M - 5; i++) {
        if (tag[i] == 1) continue;
        int mul = 1ll * (tag[i] - 1) * (i - 1) % mod * power(i, mod - 2) % mod + 1;
        mul = (1ll * mul % mod + mod) % mod;
        ans = 1ll * ans * mul % mod;
      }
      std::cout << ans << std::endl;
      return 0;
    }
    
    • 1

    信息

    ID
    3560
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    10
    已通过
    4
    上传者