【题意】给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7。

【算法】数论(莫比乌斯反演)

【题解】

$$ans=\sum_{i\leq n}\sum_{j\leq m}\frac{i*j}{gcd(i,j)}$$

$$ans=\sum_{d\leq min(n,m)}1/d\sum_{i\leq n}\sum_{j\leq m}[gcd(i,j)=d]i*j$$

$$ans=\sum_{d\leq min(n,m)}d\sum_{i\leq n/d}\sum_{j\leq m/d}[gcd(i,j)=1]i*j$$

发现后面部分只和n/d,m/d有关,于是封装后分块取值优化。

★$$ans=\sum_{d\leq min(n,m)}d*F(n/d,m/d)$$

$$F(n,m)=\sum_{i\leq n}\sum_{j\leq m}[gcd(i,j)=1]i*j$$

运用e=i*μ反演易得

★$$F(n,m)=\sum_{d\leq min(n,m)}\mu (d)*d^2*sum(n/d,m/d)$$

$$sum(n,m)=\sum_{i\leq n}\sum_{j\leq m}i*j=\sum_{i\leq n}i\sum_{j\leq m}j$$

★$$sum(n,m)=\frac{n(n+1)}{2}*\frac{m(m+1)}{2}$$

(这步由一般分配律)

最后就是两次分块取值优化,√n*√n,复杂度O(n)。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,MOD=;
int sum[maxn],n,m,miu[maxn],prime[maxn],tot;
bool mark[maxn];
int M(int x){return x>=MOD?x-MOD:x;}
int SUM(int x,int y){return 1ll*x*(x+)/%MOD*(1ll*y*(y+)/%MOD)%MOD;}
int solve(int x,int y){
int z=min(x,y),ans=,pos=;
for(int i=;i<=z;i=pos+){
pos=min(x/(x/i),y/(y/i));
ans=(ans+1ll*(sum[pos]-sum[i-])*SUM(x/i,y/i)%MOD)%MOD;
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
int z=min(n,m);
miu[]=sum[]=;
for(int i=;i<=z;i++){
if(!mark[i])miu[prime[++tot]=i]=-;
for(int j=;j<=tot&&i*prime[j]<=z;j++){
mark[i*prime[j]]=;
if(i%prime[j]==)break;
miu[i*prime[j]]=-miu[i];
}
sum[i]=(sum[i-]+1ll*i*i*miu[i]%MOD)%MOD;
}
int pos=,ans=;
for(int i=;i<=z;i=pos+){
pos=min(n/(n/i),m/(m/i));
ans=(ans+1ll*(pos+i)*(pos-i+)/%MOD*solve(n/i,m/i))%MOD;
}
printf("%d",(ans+MOD)%MOD);
return ;
}

【BZOJ】2154: Crash的数字表格 莫比乌斯反演的更多相关文章

  1. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  2. [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)

    题目描述 TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x, ...

  3. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  4. BZOJ 2154 Crash的数字表格 ——莫比乌斯反演

    求$\sum_{i=1}^n\sum_{j=1}^n lcm(i,j)$ 枚举因数 $ans=\sum_{d<=n} F(d) * d$ $F(d)$表示给定范围内两两$\sum_{gcd(i, ...

  5. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  6. Bzoj 2154: Crash的数字表格(积性函数)

    2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MB Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least ...

  7. 【刷题】BZOJ 2154 Crash的数字表格

    Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...

  8. 【bzoj2154】Crash的数字表格 莫比乌斯反演

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...

  9. ●BZOJ 2154 Crash的数字表格

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2154 题解: 莫比乌斯反演. 题意还是很清楚的,就不赘述了. 显然有 $ANS=\sum_{ ...

随机推荐

  1. Java 异常总结

    Throwablede类是 Java 语言中所有错误或异常的超类. 两个子类的实例,Error 和 Exception Error 是 Throwablede 的子类,用于指示合理的应用程序不应该试图 ...

  2. OSG学习:用多通道(multiple passes)实现透明度

    osgFX库提供了一个用于多通道渲染(multi-pass rendering)的框架.每个你想要渲染的子图都应该被添加到osgFX::Effect节点,多通道技术的定义和使用都可以在这个节点中完成. ...

  3. (打补丁 )patch

    前言: diff:逐行比较文件的不同,并且显示出来. patch: 打补丁工具,将补丁打到老文件里面,也就是diff左边的那个文件,使得老文件和新文件一样 格式:diff [选项] 老文件 新文件 格 ...

  4. 找"数学口袋精灵"bug

    团队成员的博客园地址: 刘森松:http://home.cnblogs.com/u/lssh/ 郭志豪:http://home.cnblogs.com/u/gzh13692021053/ 谭宇森:ht ...

  5. Qt使用QNetworkAccessManager实现Ftp操作

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Ftp操作     本文地址:http: ...

  6. jsonFormater之应用

        html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  7. 在64位系统上部署BDE的要点

    首先,据我所知,Borland/CodeGear没有发布过支持64bit windows的BDE安装包,如果你在网上看到了相关的BDE安装包,很有可能是使用者自己重新打包发布的. 无论是在32bit  ...

  8. Java线程间怎么实现同步

    1.Object#wait(), Object#notify()让两个线程依次执行 /** * 类AlternatePrintDemo.java的实现描述:交替打印 */ class NumberPr ...

  9. certutil在渗透测测试中的使用技巧

    certutil在渗透测测试中的使用技巧                                    0x01 前言 最近在Casey Smith‏ @subTee的twitter上学到了关 ...

  10. Linux之多线程20160705

    简单介绍一下多线程的API,线程的概念类似与一个任务或者说一个函数,线程一旦被创建就会运行,具体使用方法可以在Linux下使用man 命令查看: pthread_t:线程ID pthread_attr ...