2017中国大学生程序设计竞赛-杭州站

链接:Master of Phi

题意:求$sum_{dmid n} phi(d)* frac{n}{d}$,其中$n=prod_{i=1}^{m}{p_{i}}^{q_{i}}$

思路:设$f(n)=sum_{dmid n} phi(d)* frac{n}{d}$,显然$f(n)$是积性函数

$f(n)=f({p_1}^{c_1}*{p_2}^{c_2}*cdots * {p_m}^{c_m})=f({p_1}^{c_1})*f({p_2}^{c_2})*cdots *f({p_m}^{c_m})$

由f(n)定义得

设$n=p^c$,则

$$f(n)=phi(1)*n+phi(p)*frac{n}{p}+phi(p^2)*frac{n}{p^2}+cdots +phi(p^c)*frac{n}{p^c}$$

$$f(n)=n+(p-1)*frac{n}{p}+(p^2-p)*frac{n}{p^2}+cdots +(p^c-p^{c-1})*frac{n}{p^c}$$

$$f(n)=n*(1+c*frac{p-1}{p})=p*c+c*(p-1)*p^{c-1}$$

$$f(p^c)=p*c+c*(p-1)*p^{c-1}$$

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long long ll;

const int N = 30;
const ll mod = 998244353;

int T, m;

ll power(ll a, ll n)
{
    ll res = 1;
    while (n) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

int main()
{
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &m);
        ll res = 1;
        for (int i = 1; i <= m; i++) {
            ll p, c;
            scanf("%lld%lld", &p, &c);
            ll a = power(p, c), b = c * (p - 1) % mod * power(p, c - 1) % mod;
            res = res * ((a + b) % mod) % mod;
        }
        printf("%lld
", res);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zzzzzzy/p/13822254.html