bzoj3561: DZY Loves Math VI 莫比乌斯反演

bzoj3561: DZY Loves Math VI

Description

给定正整数n,m。求
这里写图片描述

Input

一行两个整数n,m。

Output

一个整数,为答案模1000000007后的值。

Sample Input

5 4

Sample Output

424

HINT

数据规模:
1<=n,m<=500000,共有3组数据。

分析

裸莫反
ans=ndnimj[gcd(i,j)==d](ijd)d a n s = ∑ d n ∑ i n ∑ j m [ g c d ( i , j ) == d ] ( i j d ) d
=ndndimdj[gcd(i,j)==1](idjdd)d = ∑ d n ∑ i n d ∑ j m d [ g c d ( i , j ) == 1 ] ( i d j d d ) d
=ndddndimdjk|i,k|jμ(k)(ij)d = ∑ d n d d ∑ i n d ∑ j m d ∑ k | i , k | j μ ( k ) ( i j ) d
=ndddndkμ(k)nkdimkdj(ikjk)d = ∑ d n d d ∑ k n d μ ( k ) ∑ i n k d ∑ j m k d ( i k j k ) d
=ndddndkμ(k)k2dnkdiidmkdjjd = ∑ d n d d ∑ k n d μ ( k ) k 2 d ∑ i n k d i d ∑ j m k d j d
枚举 d,k d , k 复杂度是调和级数的 O(nlogn) O ( n l o g n ) ,后面那个预处理/顺便处理/等比数列求和都可以。

代码

#include<cstdio>
const int N = 5e5 + 10, P = 1e9 + 7;
int u[N], pr[N], pw[N], s[N], tp, n, m; bool v[N];
int M(int a, int b) {return 1LL * a * b % P;}
int A(int a, int b) {a += b; return a >= P ? a - P : a;}
int Pow(int x, int k) {int r = 1; for(;k; x = M(x, x), k >>= 1) if(k & 1) r = M(r, x); return r;}
void Pre(int N) {
    u[1] = 1;
    for(int i = 2;i <= N; ++i) {
        if(!v[i]) pr[++tp] = i, u[i] = P - 1;
        for(int j = 1, t; j <= tp && pr[j] * i <= N; ++j) {
            v[t = i * pr[j]] = true;
            if(i % pr[j]) u[t] = u[i] ? P - u[i] : u[i];
            else break;
        }
    }
}
int main() {
    scanf("%d%d", &n, &m);
    if(n > m) n ^= m ^= n ^= m; Pre(m);
    for(int i = 1;i <= m; ++i) pw[i] = 1; int r = 0;
    for(int i = 1;i <= n; ++i) {
        for(int j = 1;j <= m / i; ++j) pw[j] = M(pw[j], j), s[j] = A(pw[j], s[j - 1]);
        int t = 0;
        for(int j = 1;j <= n / i; ++j) if(u[j])
            t = A(t, M(M(M(pw[j], pw[j]), M(s[n / i / j], s[m / i / j])), u[j]));
        r = A(r, M(t, Pow(i, i)));
    }
    printf("%d\n", r);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值