hdu 6428 Calculate(狄利克雷卷积 + 莫比乌斯反演)

开始推式子

a n s = ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C ϕ ( gcd ⁡ ( i , j 2 , k 3 ) ) \begin{aligned} ans = \sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}\phi(\gcd(i, j^{2}, k^{3})) \end{aligned} ans=i=1Aj=1Bk=1Cϕ(gcd(i,j2,k3))
我们令 gcd ⁡ ( i , j 2 , k 3 ) = d \gcd(i, j ^ {2}, k ^ {3}) = d gcd(i,j2,k3)=d
a n s = ∑ d = 1 min ⁡ ( A , B , C ) ϕ ( d ) ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C [ gcd ⁡ ( i , j 2 , k 3 ) = = d ] \begin{aligned} ans = \sum_{d = 1}^{\min(A, B, C)}\phi(d)\sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}[\gcd(i, j^{2}, k^{3}) == d] \end{aligned} ans=d=1min(A,B,C)ϕ(d)i=1Aj=1Bk=1C[gcd(i,j2,k3)==d]
我们设:
f ( d ) = ∑ i = 1 A ∑ j = 1 B ∑ k = 1 C [ gcd ⁡ ( i , j 2 , k 3 ) = = d ] f(d) = \sum_{i = 1}^{A}\sum_{j = 1}^{B}\sum_{k = 1}^{C}[\gcd(i, j^{2}, k^{3}) == d] f(d)=i=1Aj=1Bk=1C[gcd(i,j2,k3)==d]
F ( n ) = ∑ n ∣ d f ( d ) F(n) = \sum_{n \mid d}{f(d)} F(n)=ndf(d)
莫比乌斯反演
f ( n ) = ∑ n ∣ d μ ( d n ) ∗ F ( d ) f(n) = \sum_{n \mid d}\mu(\frac{d}{n})*F(d) f(n)=ndμ(nd)F(d)
带入上式:
a n s = ∑ k = 1 min ⁡ ( A , B , C ) ϕ ( k ) ∑ k ∣ d μ ( d k ) F ( d ) = ∑ d = 1 min ⁡ ( A , B , C ) F ( d ) ∑ k ∣ d ϕ ( k ) μ ( d k ) \begin{aligned} ans = \sum_{k = 1}^{\min(A, B, C)}\phi(k)\sum_{k \mid d}\mu(\frac{d}{k})F(d) = \sum_{d = 1}^{\min(A, B, C)}F(d)\sum_{k \mid d}\phi(k)\mu(\frac{d}{k}) \end{aligned} ans=k=1min(A,B,C)ϕ(k)kdμ(kd)F(d)=d=1min(A,B,C)F(d)kdϕ(k)μ(kd)
我们发现后面的 ∑ k ∣ d ϕ ( k ) μ ( d k ) \sum_{k \mid d}\phi(k)\mu(\frac{d}{k}) kdϕ(k)μ(kd)满足狄利克雷卷积(积性函数的狄利克雷卷积还是积性函数)
a n s = ∑ d = 1 min ⁡ ( A , B , C ) F ( d ) ( μ ∗ ϕ ) ( d ) \begin{aligned} ans = \sum_{d = 1}^{\min(A, B, C)}F(d)(\mu * \phi)(d) \end{aligned} ans=d=1min(A,B,C)F(d)(μϕ)(d)
首先我们解决这个卷积
( μ ∗ ϕ ) ( d ) = ∑ k ∣ d ϕ ( k ) μ ( d k ) (\mu * \phi)(d) = \sum_{k \mid d}\phi(k)\mu(\frac{d}{k}) (μϕ)(d)=kdϕ(k)μ(kd)
当 d = 1 , μ ( 1 ) = 1 , ϕ ( 1 ) = 1 , 所 以 ( μ ∗ ϕ ) ( 1 ) = 1 当d = 1, \mu(1) = 1, \phi(1) = 1,所以(\mu * \phi)(1) = 1 d=1,μ(1)=1,ϕ(1)=1(μϕ)(1)=1
当 d ∈ p r i m e 当d \in prime dprime, μ ( d ) = − 1 \mu(d) = -1 μ(d)=1 , ϕ ( d ) = d − 1 \phi(d) = d - 1 ϕ(d)=d1 , 所 以 ( μ ∗ ϕ ) ( d ) = d − 2 所以(\mu * \phi)(d) = d - 2 (μϕ)(d)=d2
当 d = p n 当 d = p ^ {n} d=pn, ( μ ∗ ϕ ) ( d ) = ( p − 1 ) 2 p n − 2 (\mu * \phi)(d) = (p - 1)^{2}p^{n - 2} (μϕ)(d)=(p1)2pn2
证明一下:(以下*是卷积符号)
先给个式子 ϕ ( n ) = ∑ d ∣ n ( μ ∗ ϕ ) ( d ) \phi(n) = \sum_{d \mid n}(\mu * \phi)(d) ϕ(n)=dn(μϕ)(d)
ϕ ( p n ) = ϕ ( p n − 1 ) + ( μ ∗ ϕ ) ( p n ) \phi(p^{n}) = \phi(p^{n - 1}) + (\mu * \phi)(p ^ {n}) ϕ(pn)=ϕ(pn1)+(μϕ)(pn)
( μ ∗ ϕ ) ( p n ) = ϕ ( p n ) − ϕ ( p n − 1 ) (\mu * \phi)(p^{n})=\phi(p ^ {n}) - \phi(p ^ {n - 1}) (μϕ)(pn)=ϕ(pn)ϕ(pn1)
( μ ∗ ϕ ) ( p n ) = p n − 1 ( p − 1 ) − p n − 2 ( p − 1 ) (\mu * \phi)(p^{n})=p^{n - 1}(p - 1) - p ^ {n - 2}(p - 1) (μϕ)(pn)=pn1(p1)pn2(p1)
( μ ∗ ϕ ) ( p n ) = ( p − 1 ) 2 p n − 2 (\mu * \phi)(p^{n})=(p - 1)^{2}p^{n - 2} (μϕ)(pn)=(p1)2pn2

现在就剩下个F(d)没有解决了
F(d)意义是, d ∣ i d \mid i di , d ∣ j 2 d \mid j ^ {2} dj2, d ∣ k 3 d \mid k ^ {3} dk3满足条件的d的个数
我们发现满足条件的d,当且仅当 p ⌈ q k ⌉ ∣ x p^{\lceil{\frac{q}{k}}\rceil} \mid x pkqx,p是d的质因子,q是质因子的最高次幂,
满足条件的 d = ∏ p ⌈ q k ⌉ d = \prod p^{\lceil{\frac{q}{k}}\rceil} d=pkq x k x^{k} xk

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = (1ll << 30);
const int N = 1e7 + 6;
template <typename T>
void out(T x) { cout << x << endl; }
ll fast_pow(ll a, ll b, ll p) {ll c = 1; while(b) { if(b & 1) c = c * a % p; a = a * a % p; b >>= 1;} return c;}
//开long long 疯狂超时
int pu[N], prime[N], f1[N], f2[N], tot;//pu为莫比乌斯函数与欧拉函数的狄利克雷卷积
bool mark[N];
void get_pu()
{
    memset(mark, 0, sizeof(mark));
    tot = 0;
    mark[0] = mark[1] = true;
    pu[1] = f1[1] = f2[1] = 1;//f1, f2也是积性函数
    for(int i = 2; i < N; i ++)
    {
        if(!mark[i])
        {
            prime[tot ++] = i;
            pu[i] = i - 2;
            f1[i] = f2[i] = i;
        }
        for(int j = 0; j < tot && i * prime[j] < N; j ++)
        {
            mark[i * prime[j]] = true;
            if(i % prime[j] == 0)
            {
                int tmp = i * prime[j], cnt = 0;
                while(cnt <= 3 && tmp % prime[j] == 0)
                    cnt ++, tmp /= prime[j];
                f1[i * prime[j]] = f1[i / prime[j]] * prime[j];
                if(cnt == 2)
                {
                    f2[i * prime[j]] = f2[i / prime[j]] * prime[j];
                    pu[i * prime[j]] = pu[i / prime[j]] * (prime[j] - 1) * (prime[j] - 1);
                }
                else
                {
                    f2[i * prime[j]] = f2[i / prime[j] / prime[j]] * prime[j];
                    pu[i * prime[j]] = pu[i] * prime[j];
                }
                break;
            }
            f1[i * prime[j]] = f1[i] * prime[j];
            f2[i * prime[j]] = f2[i] * prime[j];
            pu[i * prime[j]] = pu[i] * (prime[j] - 2);
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    get_pu();
    int t;
    cin >> t;
    while(t --)
    {
        int A, B, C;
        cin >> A >> B >> C;
        ll ans = 0;
        for(int i = 1; i <= A; i ++)
            ans = (ans + pu[i] * (A / i) % mod * (B / f1[i]) % mod * (C / f2[i]) % mod + mod) % mod;
        cout << ans << endl;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值