于神之怒加强版题解

∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) k ∑ i = 1 n ∑ j = 1 m ∑ g g k [ gcd ⁡ ( i , j ) = g ] ∑ g g k ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ [ gcd ⁡ ( i , j ) = 1 ] ∑ g g k ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) ∑ g min ⁡ ( n , m ) g k ∑ d min ⁡ ( ⌊ n g ⌋ , ⌊ m g ⌋ ) μ ( d ) ⌊ n g d ⌋ ⌊ m g d ⌋ ∑ T = 1 min ⁡ ( n , m ) ∑ g ∣ T g k μ ( T g ) ⌊ n T ⌋ ⌊ m T ⌋ ∑ T = 1 min ⁡ ( n , m ) ⌊ n T ⌋ ⌊ m T ⌋ ∑ g ∣ T g k μ ( T g ) h ( T ) = ∑ g ∣ T g k μ ( T g ) ∑ T = 1 min ⁡ ( n , m ) ⌊ n T ⌋ ⌊ m T ⌋ h ( T ) \sum_{i = 1}^{n} \sum_{j = 1}^{m} \gcd (i, j) ^ k \\ \sum_{i = 1}^{n} \sum_{j = 1}^{m} \sum_{g} g ^ k [\gcd (i, j) = g] \\ \sum_{g} g ^ k \sum_{i = 1}^{\lfloor \frac{n}{g} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{g} \rfloor} [\gcd (i, j) = 1] \\ \sum_{g} g ^ k \sum_{i = 1}^{\lfloor \frac{n}{g} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{g} \rfloor} \sum_{d \mid \gcd (i, j)} \mu (d) \\ \sum_{g}^{\min (n, m)} g ^ k \sum_{d}^{\min (\lfloor \frac{n}{g} \rfloor, \lfloor \frac{m}{g} \rfloor)} \mu (d) \lfloor \frac{n}{gd} \rfloor \lfloor \frac{m}{gd} \rfloor \\ \sum\limits_{T = 1}^{\min (n, m)} \sum\limits_{g \mid T} g^k \mu(\dfrac T g) \lfloor \dfrac n T \rfloor \lfloor \dfrac m T \rfloor \\ \sum\limits_{T = 1}^{\min (n, m)} \lfloor \dfrac n T \rfloor \lfloor \dfrac m T \rfloor \sum\limits_{g \mid T} g^k \mu(\dfrac T g) \\ h (T) = \sum\limits_{g \mid T} g^k \mu(\dfrac T g) \\ \sum\limits_{T = 1}^{\min (n, m)} \lfloor \dfrac n T \rfloor \lfloor \dfrac m T \rfloor h (T) i=1nj=1mgcd(i,j)ki=1nj=1mggk[gcd(i,j)=g]ggki=1gnj=1gm[gcd(i,j)=1]ggki=1gnj=1gmdgcd(i,j)μ(d)gmin(n,m)gkdmin(⌊gn,gm⌋)μ(d)gdngdmT=1min(n,m)gTgkμ(gT)TnTmT=1min(n,m)TnTmgTgkμ(gT)h(T)=gTgkμ(gT)T=1min(n,m)TnTmh(T)
因为 f ( n ) = ∑ d ∣ n d k , μ ( n ) f (n) = \sum_{d \mid n} d^k, \mu (n) f(n)=dndk,μ(n) 都是积性函数,由迪利克雷卷积可知, ( f ∗ μ ) ( n ) (f * \mu)(n) (fμ)(n) 也是积性函数,所以 h ( T ) h (T) h(T) 是一个积性函数。

参考代码

#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define db double
#define LL long long
#define int long long
#define PII pair <int, int>
#define ULL unsigned long long
#define MP(x,y) make_pair (x, y)
#define rep(i,j,k) for (int i = (j); i <= (k); i++)
#define per(i,j,k) for (int i = (j); i >= (k); i--)

template <typename T>
void read (T &x) {
    x = 0; T f = 1; 
    char ch = getchar ();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar ();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + ch - '0';
        ch = getchar ();
    }
    x *= f;
}
template <typename T, typename... Args>
void read (T &x, Args&... Arg) {
    read (x), read (Arg...);
}
const int MaxPrint = 1000;
int Poi_For_Print, Tmp_For_Print[MaxPrint + 5];
template <typename T>
void write (T x) {
	if (x == 0) {
		putchar ('0');
		return;
	}
    bool flag = (x < 0 ? 1 : 0);
    x = (x < 0 ? -x : x);
    while (x) Tmp_For_Print[++Poi_For_Print] = x % 10, x /= 10;
    if (flag) putchar ('-');
    while (Poi_For_Print) putchar (Tmp_For_Print[Poi_For_Print--] + '0');
}
template <typename T, typename... Args>
void write (T x, Args... Arg) {
    write (x); putchar (' '); write (Arg...);
}
template <typename T, typename... Args>
void print (T x, char ch) {
    write (x); putchar (ch);
}
template <typename T> T Max (T x, T y) { return x > y ? x : y; }
template <typename T> T Min (T x, T y) { return x < y ? x : y; }
template <typename T> T Abs (T x) { return x > 0 ? x : -x; }

const int Mod = 1e9 + 7;
const int Maxn = 5 * 1e6;

int t, k, n, m;

int quick_pow (int x, int y) {
    int res = 1;
    while (y) {
        if (y & 1) res = (res * x) % Mod;
        x = (x * x) % Mod; y >>= 1;
    }
    return res;
}
int cnt, primes[Maxn + 5];
int mu[Maxn + 5], h[Maxn + 5], pre[Maxn + 5], px[Maxn + 5];
bool vis[Maxn + 5];
void Euler () {
    mu[1] = 1;
    h[1] = 1;
    rep (i, 2, Maxn) {
        if (!vis[i]) {
            primes[++cnt] = i;
            mu[i] = -1;
            h[i] = quick_pow (i, k) * mu[1] % Mod + quick_pow (1, k) * mu[i] % Mod;
            h[i] %= Mod;
            px[i] = i;
        }
        rep (j, 1, cnt) {
            if (primes[j] > Maxn / i) break;
            vis[primes[j] * i] = 1;
            if (i % primes[j] == 0) {
                mu[i * primes[j]] = 0;
                if (i == px[i]) h[i * primes[j]] = quick_pow (i * primes[j], k) + mu[primes[j]] * quick_pow (i, k) % Mod;
                else h[i * primes[j]] = h[i / px[i]] * h[primes[j] * px[i]] % Mod; // i * primes[j] = primes[j] ^ q 要特判 
                px[i * primes[j]] = px[i] * primes[j] % Mod;
                break;
            }
            mu[i * primes[j]] = (mu[i] * mu[primes[j]]) % Mod;
            h[i * primes[j]] = (h[i] * h[primes[j]]) % Mod;
            px[i * primes[j]] = primes[j];
        }
    }
    rep (i, 1, Maxn) pre[i] = (pre[i - 1] + h[i]) % Mod;
}

signed main () {
//    freopen ("C:\\Users\\Administrator\\Desktop\\lihan\\1.in", "r", stdin);
//     freopen ("C:\\Users\\Administrator\\Desktop\\lihan\\1.out", "w", stdout);

    read (t, k);
    Euler ();
    while (t--) {
        read (n, m);
        
        int l = 1, r, res = 0;
        while (l <= Min (n, m)) {
            r = Min (n / (n / l), m / (m / l));
            res += (n / l) * (m / l) % Mod * (pre[r] - pre[l - 1]) % Mod;
            res = (res % Mod + Mod) % Mod;
            l = r + 1;
        }
        print (res, '\n');
    }
    return 0;
}

又是推错的废式子

∑ i = 1 n ∑ j = 1 m gcd ⁡ ( i , j ) k ∑ i = 1 n ∑ j = 1 m ∑ g g k [ gcd ⁡ ( i , j ) = g ] ∑ g g k ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ [ gcd ⁡ ( i , j ) = 1 ] ∑ g g k ∑ i = 1 ⌊ n g ⌋ ∑ j = 1 ⌊ m g ⌋ ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) ∑ g min ⁡ ( n , m ) g k ∑ d min ⁡ ( ⌊ n g ⌋ , ⌊ m g ⌋ ) μ ( d ) ⌊ n g d ⌋ ⌊ m g d ⌋ h ( g ) = ∑ d min ⁡ ( ⌊ n g ⌋ , ⌊ m g ⌋ ) μ ( d ) ⌊ ⌊ n g ⌋ d ⌋ ⌊ ⌊ m g ⌋ d ⌋ ∑ g min ⁡ ( n , m ) g k h ( g ) \begin{aligned} \sum_{i = 1}^{n} \sum_{j = 1}^{m} \gcd (i, j) ^ k \\ \sum_{i = 1}^{n} \sum_{j = 1}^{m} \sum_{g} g ^ k [\gcd (i, j) = g] \\ \sum_{g} g ^ k \sum_{i = 1}^{\lfloor \frac{n}{g} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{g} \rfloor} [\gcd (i, j) = 1] \\ \sum_{g} g ^ k \sum_{i = 1}^{\lfloor \frac{n}{g} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{g} \rfloor} \sum_{d \mid \gcd (i, j)} \mu (d) \\ \sum_{g}^{\min (n, m)} g ^ k \sum_{d}^{\min (\lfloor \frac{n}{g} \rfloor, \lfloor \frac{m}{g} \rfloor)} \mu (d) \lfloor \frac{n}{gd} \rfloor \lfloor \frac{m}{gd} \rfloor \\ h (g) = \sum_{d}^{\min (\lfloor \frac{n}{g} \rfloor, \lfloor \frac{m}{g} \rfloor)} \mu (d) \lfloor \frac{\lfloor \frac{n}{g} \rfloor}{d} \rfloor \lfloor \frac{\lfloor \frac{m}{g} \rfloor}{d} \rfloor \\ \sum_{g}^{\min (n, m)} g ^ k h (g) \end{aligned} i=1nj=1mgcd(i,j)ki=1nj=1mggk[gcd(i,j)=g]ggki=1gnj=1gm[gcd(i,j)=1]ggki=1gnj=1gmdgcd(i,j)μ(d)gmin(n,m)gkdmin(⌊gn,gm⌋)μ(d)gdngdmh(g)=dmin(⌊gn,gm⌋)μ(d)dgndgmgmin(n,m)gkh(g)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值