传送门


看到\(gcd\)相关先推式子(默认\(N \leq M\)):

\(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^M (lcm(i,j))^{gcd(i,j)} & = \sum\limits_{d=1}^N d^d \sum\limits_{i=1}^\frac{N}{d} \sum\limits_{j=1}^\frac{M}{d} (ij)^{d} \sum\limits_{p \mid gcd(i,j)} \mu(p) \\ & = \sum\limits_{d=1}^N d^d \sum\limits_{p=1}^\frac{N}{d} \mu(p) p^{2d} \sum\limits_{i=1}^\frac{N}{dp} i^d \sum\limits_{j=1}^\frac{M}{dp} j^d \end{align*}\)

推到这里不需要套路地枚举\(T = dp\)了,到这里就开始做。

看到这道要筛东西的数论题的数据范围为\(500000\),这意味着这道题有极大可能用\(O(nlogn)\)算法。发现上面的式子中,先枚举\(d\)、然后枚举\(p\),总复杂度就是\(O(nlogn)\),所以我们需要均摊\(O(1)\)地得到后面的两个自然数幂次和。

其实可以发现,对于每一个\(d\),有效的\(i^d\)和\(j^d\)的个数为\(\frac{M}{d}\)个,也是一个调和级数。所以我们每一次把这些次幂和前缀和处理出来,复杂度仍然是对的。总复杂度\(O(nlogn)\)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//This code is written by Itst
using namespace std;

const int MAXN = 5e5 + 7 , MOD = 1e9 + 7;
int N , M , cnt , num[MAXN] , sum[MAXN] , prime[MAXN] , mu[MAXN];
bool nprime[MAXN];

inline int poww(long long a , int b){
    int times = 1;
    while(b){
        if(b & 1) times = times * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return times;
}

void init(){
    mu[1] = 1;
    for(int i = 2 ; i <= N ; ++i){
        if(!nprime[i]){
            prime[++cnt] = i;
            mu[i] = -1;
        }
        for(int j = 1 ; prime[j] * i <= N && j <= cnt ; ++j){
            nprime[i * prime[j]] = 1;
            if(i % prime[j] == 0) break;
            mu[i * prime[j]] = -1 * mu[i];
        }
    }
}

int main(){
#ifndef ONLINE_JUDGE
    //freopen("in","r",stdin);
    //freopen("out","w",stdout);
#endif
    init();
    cin >> N >> M;
    if(N > M) swap(N , M);
    init();
    for(int i = 1 ; i <= M ; ++i) num[i] = 1;
    int all = 0;
    for(int i = 1 ; i <= N ; ++i){
        for(int j = 1 ; j <= M / i ; ++j){
            num[j] = 1ll * num[j] * j % MOD;
            sum[j] = (sum[j - 1] + num[j]) % MOD;
        }
        int cur = 0;
        for(int j = 1 ; j <= N / i ; ++j)
            cur = (cur + 1ll * mu[j] * num[j] * num[j] % MOD * sum[N / i / j] % MOD * sum[M / i / j] % MOD + MOD) % MOD;
        all = (all + 1ll * poww(i , i) * cur) % MOD;
    }
    cout << all;
    return 0;
}

BZOJ3561 DZY Loves Math VI 莫比乌斯反演的更多相关文章

  1. 【bzoj3561】DZY Loves Math VI 莫比乌斯反演

    题目描述 给定正整数n,m.求   输入 一行两个整数n,m. 输出 一个整数,为答案模1000000007后的值. 样例输入 5 4 样例输出 424 题解 莫比乌斯反演 (为了方便,以下公式默认$ ...

  2. BZOJ 3561: DZY Loves Math VI 莫比乌斯反演+复杂度分析

    推到了一个推不下去的形式,然后就不会了 ~ 看题解后傻了:我推的是对的,推不下去是因为不需要再推了. 复杂度看似很大,但其实是均摊 $O(n)$ 的,看来分析复杂度也是一个能力啊 ~ code: #i ...

  3. 【BZOJ3309】DZY Loves Math(莫比乌斯反演)

    [BZOJ3309]DZY Loves Math(莫比乌斯反演) 题面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)表示\(x\)分解质因 ...

  4. [BZOJ3561] DZY Loves Math VI

    (14.10.28改) 本来只想写BZOJ3739:DZY Loves Math VIII的,不过因为和VI有关系,而且也没别人写过VI的题解,那么写下. 不过我还不会插公式…… http://www ...

  5. BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)

    一通正常的莫比乌斯反演后,我们只需要求出g(n)=Σf(d)*μ(n/d)的前缀和就好了. 考虑怎么求g(n).当然是打表啊.设n=∏piai,n/d=∏pibi .显然若存在bi>1则这个d没 ...

  6. DZY LOVES MATH (莫比乌斯反演)

    OK!开始更新莫比乌斯反演 先看了一下数据范围,嗯,根据\(jiry\)老师的真言,我们一定是可以筛一遍然后用根号或者是\(log\)的算法. 题目思路挺简单,就是把原始的式子化成: \(\sum_{ ...

  7. BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演

    原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...

  8. BZOJ3561 DZY Loves Math VI 【莫比乌斯反演】

    题目 给定正整数n,m.求 输入格式 一行两个整数n,m. 输出格式 一个整数,为答案模1000000007后的值. 输入样例 5 4 输出样例 424 提示 数据规模: 1<=n,m<= ...

  9. DZY Loves Math(莫比乌斯反演)

    \(x=p_1^{\alpha_1}p_2^{\alpha_2}...p_c^{\alpha_c}\) \(f(x)=\max(\alpha_1,\alpha_2,...,\alpha_c)\) \( ...

随机推荐

  1. 【Wyn Enterprise BI知识库】 什么是商业智能 ZT

    商业智能(Business Intelligence,BI),又称商务智能,指用现代数据仓库技术.在线分析处理技术.数据挖掘和数据展现技术进行数据分析以实现商业价值. 图1:商业智能(BI)系统 商业 ...

  2. Future FutrueTask Callable类源码说明以及原理使用

    1.Future Callable FutureTask 源码说明 JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口, ...

  3. cordov vue项目中调用手机原生api

    cordova不仅可以把vue项目打包成app,还可以让vue借助cordova调用手机原生的api 比如拍照 比如图片上传 比如定位 比如扫描二维码 比如支付等等 Vue Cordova教程-Vue ...

  4. SpringBoot-学习笔记

    启动方式 运行main方法 @SpringBootApplication public class BootApplication { public static void main(String[] ...

  5. MS SQL CASE WHEN 的用法

    前言 由于经常使用 case when 的2种情况方式,如果=1 则*** 否则 *** 结束.久而久之,都以为只能这么用,都忘记了Case WHEN 的用法. 示例   ,              ...

  6. [20181015]为什么是3秒.txt

    [20181015]为什么是3秒.txt --//以前测试:连接http://blog.itpub.net/267265/viewspace-2144765/=>为什么是12秒.txt.--// ...

  7. 洗礼灵魂,修炼python(64)--爬虫篇—re模块/正则表达式(2)

    前面学习了元家军以及其他的字符匹配方法,那得会用啊对吧?本篇博文就简单的解析怎么运用 正则表达式使用 前面说了正则表达式的知识点,本篇博文就是针对常用的正则表达式进行举例解析.相信你知道要用正则表达式 ...

  8. c/c++ 智能指针 shared_ptr 使用

    智能指针 shared_ptr 使用 上一篇智能指针是啥玩意,介绍了什么是智能指针. 这一篇简单说说如何使用智能指针. 一,智能指针分3类:今天只唠唠shared_ptr shared_ptr uni ...

  9. LeetCode算法题-Maximum Depth of Binary Tree

    这是悦乐书的第164次更新,第166篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第23题(顺位题号是104).给定二叉树,找到它的最大深度.最大深度是从根节点到最远叶节 ...

  10. 自定义实现HashMap的put、get方法

    public class HashMap{ public static void main(String[] args){ put("aa", "wo ai ni&quo ...