2019南昌网络赛G. tsy‘s number(反演 + 积性函数O(n)预处理)

tsy’s number

推式子

∑ i = 1 n ∑ j = 1 n ∑ k = 1 n ϕ ( i ) ϕ ( j 2 ) ϕ ( k 3 ) ϕ ( i ) ϕ ( j ) ϕ ( k ) ϕ ( g c d ( i , j , k ) ) 我 们 假 定 j = p 1 k 1 p 2 k 2 p 3 p 3 … … p n k n , 有 ϕ ( j ) = p 1 k 1 − 1 ( p 1 − 1 ) p 2 k 2 − 1 ( p 2 − 1 ) p 3 k 3 − 1 ( p 3 − 1 ) … … p n k n − 1 ( p n − 1 ) , ϕ ( j 2 ) = p 1 2 k 1 − 1 ( p 1 − 1 ) p 2 2 k 2 − 1 ( p 2 − 1 ) p 3 2 k 3 − 1 ( p 3 − 1 ) … … p n 2 k n − 1 ( p n − 1 ) ϕ ( j 2 ) ϕ ( j ) = p 1 k 1 p 2 k 2 p 3 p 3 … … p n k n = j 同 样 的 , 我 们 不 难 推 出 ϕ ( k 3 ) ϕ ( k ) = k 2 对 上 式 化 简 : = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j k 2 ϕ ( g c d ( i , j , k ) ) = ∑ d = 1 n ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j k 2 ϕ ( d ) ( g c d ( i , j , k ) = d ) = ∑ d = 1 n d 3 ϕ ( d ) ∑ i = 1 n d ∑ j = 1 n d ∑ k = 1 n d j k 2 ( g c d ( i , j , k ) = 1 ) = ∑ d = 1 n d 3 ϕ ( d ) ∑ t = 1 n d μ ( t ) t 3 ∑ i = 1 n d t ∑ j = 1 n d t ∑ k = 1 n d t j k 2 设 f ( n ) = ∑ i = 1 n ∑ j = 1 n ∑ k = 1 n j k 2 , T = d t , 再 次 对 上 式 化 简 : = ∑ T = 1 n f ( n T ) T 3 ∑ d ∣ T ϕ ( d ) μ ( T d ) 我 们 假 设 g ( n ) = n 3 ∑ d ∣ n ϕ ( d ) μ ( n d ) \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \sum_{k = 1} ^{n} \frac{\phi(i) \phi(j ^ 2) \phi(k ^ 3)}{ \phi(i) \phi(j) \phi(k)}\phi(gcd(i, j, k))\\ 我们假定j = p_1 ^{k_1}p_2^{k_2}p_3 ^{p_3} ……p_n ^{k_n},有\phi(j) = p_1^{k_1 - 1}(p_1 - 1)p_2 ^{k_2 - 1}(p_2 - 1)p_3^{k_3 - 1}(p_3 - 1) …… p_n ^{k_n - 1}(p_n - 1),\\ \phi(j ^ 2) = p_1^{2k_1 - 1}(p_1 - 1)p_2 ^{2k_2 - 1}(p_2 - 1)p_3^{2k_3 - 1}(p_3 - 1) …… p_n ^{2k_n - 1}(p_n - 1)\\ \frac{\phi(j ^ 2)}{\phi(j)} = p_1 ^{k_1}p_2^{k_2}p_3 ^{p_3} ……p_n ^{k_n} = j\\ 同样的,我们不难推出\frac{\phi(k ^ 3)}{\phi(k)} = k ^ 2\\ 对上式化简:\\ = \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \sum_{k = 1} ^{n} jk ^ 2 \phi(gcd(i, j, k))\\ = \sum_{d = 1} ^{n} \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} \sum_{k = 1} ^{n} jk ^ 2 \phi(d)(gcd(i, j, k) = d)\\ = \sum_{d = 1} ^{n} d ^ 3 \phi(d) \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}} \sum_{k = 1} ^{\frac{n}{d}}jk ^ 2 (gcd(i, j, k) = 1)\\ = \sum_{d = 1} ^{n} d ^ 3 \phi(d) \sum_{t = 1} ^{\frac{n}{d}} \mu(t) t ^ 3 \sum_{i = 1} ^{\frac{n}{dt}} \sum_{j = 1} ^{\frac{n}{dt}} \sum_{k = 1} ^{\frac{n}{dt}}j k ^ 2\\ 设f(n) = \sum \limits _{i = 1} ^{n} \sum\limits_{j = 1} ^{n} \sum\limits_{k = 1} ^{n} j k ^ 2,T = dt,再次对上式化简:\\ = \sum_{T = 1} ^{n} f(\frac{n}{T}) T ^ 3 \sum_{d \mid T} \phi(d) \mu(\frac{T}{d})\\ 我们假设g(n) = n ^ 3 \sum_{d \mid n} \phi(d) \mu(\frac{n}{d})\\ i=1nj=1nk=1nϕ(i)ϕ(j)ϕ(k)ϕ(i)ϕ(j2)ϕ(k3)ϕ(gcd(i,j,k))j=p1k1p2k2p3p3pnknϕ(j)=p1k11(p11)p2k21(p21)p3k31(p31)pnkn1(pn1)ϕ(j2)=p12k11(p11)p22k21(p21)p32k31(p31)pn2kn1(pn1)ϕ(j)ϕ(j2)=p1k1p2k2p3p3pnkn=jϕ(k)ϕ(k3)=k2=i=1nj=1nk=1njk2ϕ(gcd(i,j,k))=d=1ni=1nj=1nk=1njk2ϕ(d)(gcd(i,j,k)=d)=d=1nd3ϕ(d)i=1dnj=1dnk=1dnjk2(gcd(i,j,k)=1)=d=1nd3ϕ(d)t=1dnμ(t)t3i=1dtnj=1dtnk=1dtnjk2f(n)=i=1nj=1nk=1njk2T=dt=T=1nf(Tn)T3dTϕ(d)μ(dT)g(n)=n3dnϕ(d)μ(dn)

显 然 n 3 是 较 好 解 决 的 , 所 以 我 们 考 虑 后 面 的 式 子 ∑ d ∣ n ϕ ( d ) μ ( n d ) 写 成 迪 利 克 雷 卷 积 的 形 式 g ( n ) = ( ϕ ∗ μ ) ( n ) , 显 然 g ( n ) 是 一 个 积 性 函 数 n = 1 , g ( 1 ) = ϕ ( 1 ) μ ( 1 ) = 1 n = p , g ( p ) = ϕ ( 1 ) μ ( p ) + ϕ ( p ) μ ( 1 ) = 1 ∗ ( − 1 ) + ( p − 1 ) ∗ 1 = p − 2 n = p k d , 由 于 p k 与 d 互 质 , 所 以 有 g ( n ) = g ( p k ) g ( d ) 所 以 我 们 重 点 考 虑 如 何 求 g ( p k ) g ( p k ) = ∑ i = 0 k ϕ ( p i ) μ ( p k − i ) = ∑ i = 0 k ϕ ( p k − i ) μ ( p i ) 显 然 对 于 i ≥ 2 时 μ ( p i ) = 0 , 所 以 g ( p k ) = ∑ i = 0 1 ϕ ( p k − i ) μ ( p i ) = ϕ ( p k ) − ϕ ( p k − 1 ) 这 里 预 处 理 就 结 束 了 , 接 下 来 就 能 快 乐 的 数 论 分 块 了 。 显然n ^ 3是较好解决的,所以我们考虑后面的式子\sum_{d \mid n} \phi(d) \mu(\frac{n}{d})\\ 写成迪利克雷卷积的形式g(n) = (\phi * \mu)(n),显然g(n)是一个积性函数\\ n = 1, g(1) = \phi(1)\mu(1) = 1\\ n = p, g(p) = \phi(1)\mu(p) + \phi(p) \mu(1) = 1 * (-1) + (p - 1) * 1 = p - 2\\ n = p ^ k d,由于p ^ k与d互质,所以有g(n) = g(p ^ k) g(d)\\所以我们重点考虑如何求g(p ^ k)\\ g(p ^ k) = \sum_{i = 0} ^{k} \phi(p ^ i)\mu(p ^ {k - i})\\ = \sum_{i = 0} ^{k} \phi(p ^ {k - i})\mu(p ^ i)\\ 显然对于i \geq 2时\mu(p ^ i) = 0,所以\\ g(p ^ k) = \sum_{i = 0} ^{1} \phi(p ^ {k - i}) \mu(p ^ i) = \phi(p ^ k) - \phi(p ^ {k - 1})\\ 这里预处理就结束了,接下来就能快乐的数论分块了。 n3dnϕ(d)μ(dn)g(n)=(ϕμ)(n)g(n)n=1,g(1)=ϕ(1)μ(1)=1n=p,g(p)=ϕ(1)μ(p)+ϕ(p)μ(1)=1(1)+(p1)1=p2n=pkdpkdg(n)=g(pk)g(d)g(pk)g(pk)=i=0kϕ(pi)μ(pki)=i=0kϕ(pki)μ(pi)i2μ(pi)=0,g(pk)=i=01ϕ(pki)μ(pi)=ϕ(pk)ϕ(pk1)

代码

/*
  Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>

#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;

inline ll read() {
    ll f = 1, x = 0;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-')    f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}

const int N = 1e7 + 10, mod = 1 << 30, inv3 = 715827883;

int prime[N], cnt;

ll f[N], g[N], n;

bool st[N];

ll quick_pow(ll a, int n) {
    ll ans = 1;
    while(n) {
        if(n & 1) ans = ans * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return ans;
}

void init() {
    g[1] = 1;
    for(int i = 2; i < N; i++) {
        if(!st[i]) {
            prime[cnt++] = i;
            g[i] = i - 2;
        }
        for(int j = 0; j < cnt && i * prime[j] < N; j++) {
            st[i * prime[j]] = 1;
            if(i % prime[j] == 0) {
                int num = 1, temp = i;
                while(temp % prime[j] == 0) {
                    temp /= prime[j], num++;
                }
                g[i * prime[j]] = quick_pow(prime[j], num - 2) * ((1ll * prime[j] * prime[j] % mod - 2 * prime[j] % mod + 1 + mod) % mod) % mod * g[temp] % mod;
                break;
            }
            g[i * prime[j]] = g[i] * g[prime[j]];
        }
    }
    for(int i = 1; i < N; i++) {
        f[i] = ((1ll * i * (1 + i) / 2 % mod) * i % mod) * ((1ll * (i + 1) * i / 2) % mod * (2 * i + 1) % mod * inv3 % mod) % mod;
        g[i] = (1ll * i * i % mod * i % mod * g[i] % mod + g[i - 1]) % mod;
    }
}

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    init();
    int T = read();
    while(T--) {
        n = read();
        ll ans = 0;
        for(ll l = 1, r; l <= n; l = r + 1) {
            r = n / (n / l);
            ans = (ans + 1ll * f[n / l] * ((g[r] - g[l - 1] + mod) % mod) % mod) % mod;
        }
        printf("%lld\n", ans);
    }
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值