bzoj3309 DZY Loves Math

题面bzoj3309

题意:设 f ( n ) f(n) f(n)表示 n n n所含质因子的最大幂指数。求 ∑ i = 1 a ∑ j = 1 b f ( g c d ( i , j ) ) \sum _{i=1} ^a \sum _{j=1} ^b f (gcd (i, j)) i=1aj=1bf(gcd(i,j))

题解

a n s = ∑ i = 1 a ∑ j = 1 b f ( g c d ( i , j ) ) = ∑ d = 1 a f ( d ) ∑ i = 1 a ∑ j = 1 b [ g c d ( i , j ) = d ] = ∑ d = 1 a f ( d ) ∑ i = 1 a d μ ( i ) ⌊ a i d ⌋ ⌊ b i d ⌋ \begin {aligned} ans &= \sum _{i=1} ^a \sum _{j=1} ^b f (gcd (i, j)) \\ &= \sum _{d=1} ^a f (d) \sum _{i=1} ^a \sum _{j=1} ^b [gcd (i, j) = d] \\ &= \sum _{d=1} ^a f(d) \sum _{i=1} ^{\frac a d} \mu (i) \lfloor \frac a {id} \rfloor \lfloor \frac b {id} \rfloor \end {aligned} ans=i=1aj=1bf(gcd(i,j))=d=1af(d)i=1aj=1b[gcd(i,j)=d]=d=1af(d)i=1daμ(i)idaidb

T = i d T=id T=id a n s = ∑ T = 1 a ⌊ a T ⌋ ⌊ b T ⌋ ∑ d ∣ T f ( d ) μ ( T d ) ans = \sum _{T=1} ^a \lfloor \frac a T \rfloor \lfloor \frac b T \rfloor \sum _{d \mid T} f(d) \mu (\frac T d) ans=T=1aTaTbdTf(d)μ(dT)

关键在于如何求 ∑ d ∣ T f ( d ) μ ( T d ) \sum _{d \mid T} f (d) \mu (\frac T d) dTf(d)μ(dT)

考虑 T = p 1 a 1 p 2 a 2 … p n a n T = p_1 ^{a_1} p_2 ^{a_2} … p_n ^{a_n} T=p1a1p2a2pnan

μ ( T d ) \mu (\frac T d) μ(dT)非零采用贡献,因此 T d \frac T d dT的每个质因数最多取1,总共有 2 n 2^n 2n d d d

假设选定某个质因数 p x a x − 1 p_x ^{a_x - 1} pxax1作为最高次幂,那么其他比它低的幂次都可以选或者不选,共有 2 k 2^k 2k个。

f ( d ) f(d) f(d)值不变, μ ( T d ) \mu (\frac T d) μ(dT)一一对应-1、1,因此 ∑ d ∣ T f ( d ) μ ( T d ) = 0 \sum _{d \mid T} f(d) \mu (\frac T d)=0 dTf(d)μ(dT)=0

因此如果幂次不全部相等,和为0。

假设幂次全部相等,即 T = ( p 1 p 2 … p n ) a T = (p_1 p_2 … p_n) ^a T=(p1p2pn)a

d = ( p 1 p 2 … p n ) a − 1 d = (p_1 p_2 … p_n) ^{a - 1} d=(p1p2pn)a1时, f ( d ) = a − 1 f(d) = a - 1 f(d)=a1

其他情况下 f ( d ) = a f(d) = a f(d)=a

先假设所有 f ( d ) = a f(d) = a f(d)=a,显然 ∑ d ∣ T μ ( T d ) = 0 \sum _{d \mid T} \mu (\frac T d) = 0 dTμ(dT)=0

但是因为有一种情况 f ( d ) = a − 1 f(d) = a-1 f(d)=a1,因此要减去 f ( d ) f(d) f(d)中的1

贡献是 − 1 ∗ μ ( p 1 p 2 p 3 … p n ) = ( − 1 ) n + 1 -1 * \mu (p_1 p_2 p_3 … p_n) = (-1) ^ {n + 1} 1μ(p1p2p3pn)=(1)n+1

线性筛时记录一下去掉最小质因子后的数 l s t [ i ] lst[i] lst[i],最小质因子的次数,以及 ∑ d ∣ T f ( d ) μ ( T d ) \sum _{d \mid T} f(d) \mu (\frac T d) dTf(d)μ(dT)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 1e7 + 10 ;
int prime[maxn], tot ;
int lst[maxn], fp[maxn], g[maxn] ;
bool vis[maxn] ;
void init () {
    for (int i = 2; i < maxn; i ++) {
        if (!vis[i]) {
            prime[++ tot] = i ;
            lst[i] = fp[i] = g[i] = 1 ;
        }
        for (int j = 1; j <= tot && i * prime[j] < maxn; j ++) {
            int x = i * prime[j] ;
            vis[x] = 1 ;
            if (i % prime[j] == 0) {
                lst[x] = lst[i] ;
                fp[x] = fp[i] + 1 ;
                if (lst[x] == 1) g[x] = 1 ;
                else g[x] = (fp[x] == fp[lst[x]] ? -g[lst[x]] : 0) ;
                break ;
            }
            lst[x] = i; fp[x] = 1; g[x] = (fp[i] == 1 ? -g[i] : 0) ;
        }
    }
    for (int i = 1; i < maxn; i ++) g[i] += g[i - 1] ;
}
int main() {
    init () ;
    int T ;
    cin >> T ;
    while (T --) {
        int a, b ;
        scanf("%d%d", &a, &b) ;
        if (a > b) swap (a, b) ;
        ll ans = 0 ;
        for (int i = 1, j; i <= a; i = j + 1) {
            j = min (a / (a / i), b / (b / i)) ;
            ans += 1ll * (a / i) * (b / i) * (g[j] - g[i - 1]) ;
        }
        printf("%lld\n", ans) ;
    }
    return 0 ;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值