枚举倍数的一种灵活的变形:g(d)=∑d∣inf(i)=∑i=1⌊nd⌋f(i⋅d)g(d)=\sum_{d|i}^nf(i)=\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i\cdot d)g(d)=∑d∣in​f(i)=∑i=1⌊dn​⌋​f(i⋅d)
很显然,但有时能发挥大作用。
其实本质还是要理解西格玛究竟是在算什么

解析

一个重要的前置结论:
d(i⋅j)=∑x∣i,y∣j[gcd⁡(x,y)=1]d(i\cdot j)=\sum_{x|i,y|j}[\gcd(x,y)=1]d(i⋅j)=x∣i,y∣j∑​[gcd(x,y)=1]
证明:
尝试把所有互质的数对 (x,y)(x,y)(x,y) 和 i⋅ji\cdot ji⋅j 的所有因子建立双射关系。首先,对于只有 i,ji,ji,j 一方有的质因子,直接归给有该项质因子的那一方对应的 xxx 或 yyy。对于双方都有的质因子 ppp,若 iii 的对应次数为 aaa,jjj 的对应次数为 bbb,如果 i⋅ji\cdot ji⋅j 的某个因子 ppp 的次数 ccc 满足 c≤ac\le ac≤a,就当成 xxx 含有 pcp^cpc 的因子;若 c>ac>ac>a,就当成 yyy 含有 pc−ap^{c-a}pc−a 次方的因子。这样我们就建立起了双射关系,且所有的 x,yx,yx,y 都是互质的,证毕。

我们再化一下这个 ddd 函数:
d(i,j)=∑x∣i∑y∣j[gcd⁡(i,j)=1]=∑x∣i∑y∣j∑k∣gcd⁡(x,y)μ(k)=∑k∣i,k∣jμ(k)∑k∣x,x∣i∑k∣y,y∣j1=∑k∣i,k∣jμ(k)∑x∣ikik∑y∣jkjk1=∑k∣i,k∣jμ(k)d(ik)d(jk)d(i,j)=\sum_{x|i}\sum_{y|j}[\gcd(i,j)=1]\\=\sum_{x|i}\sum_{y|j}\sum_{k|\gcd(x,y)}\mu(k)\\=\sum_{k|i,k|j}\mu(k)\sum_{k|x,x|i}\sum_{k|y,y|j}1\\=\sum_{k|i,k|j}\mu(k)\sum_{x|\frac{i}{k}}^{\frac{i}{k}}\sum_{y|\frac{j}{k}}^{\frac{j}{k}}1\\=\sum_{k|i,k|j}\mu(k)d(\frac{i}{k})d(\frac{j}{k})d(i,j)=x∣i∑​y∣j∑​[gcd(i,j)=1]=x∣i∑​y∣j∑​k∣gcd(x,y)∑​μ(k)=k∣i,k∣j∑​μ(k)k∣x,x∣i∑​k∣y,y∣j∑​1=k∣i,k∣j∑​μ(k)x∣ki​∑ki​​y∣kj​∑kj​​1=k∣i,k∣j∑​μ(k)d(ki​)d(kj​)
带回原式:
∑i=1n∑j=1md(ij)=∑i=1n∑j=1m∑k∣i,k∣jμ(k)d(ik)d(jk)=∑kμ(k)∑k∣in∑k∣jmd(ik)d(jk)=∑kμ(k)∑i=1⌊nk⌋∑j=1⌊mk⌋d(i)d(j)=∑kμ(k)(∑i=1⌊nk⌋d(i))⋅(∑j=1⌊mk⌋d(j))\sum_{i=1}^n\sum_{j=1}^md(ij)=\sum_{i=1}^n\sum_{j=1}^m\sum_{k|i,k|j}\mu(k)d(\frac{i}{k})d(\frac{j}{k})\\=\sum_{k}\mu(k)\sum_{k|i}^n\sum_{k|j}^md(\frac i k)d(\frac j k)\\=\sum_k\mu(k)\sum_{i=1}^{\lfloor\frac n k\rfloor}\sum_{j=1}^{\lfloor\frac m k\rfloor}d(i)d(j)\\=\sum_k\mu(k)(\sum_{i=1}^{\lfloor\frac n k\rfloor}d(i))\cdot(\sum_{j=1}^{\lfloor\frac m k\rfloor}d(j))i=1∑n​j=1∑m​d(ij)=i=1∑n​j=1∑m​k∣i,k∣j∑​μ(k)d(ki​)d(kj​)=k∑​μ(k)k∣i∑n​k∣j∑m​d(ki​)d(kj​)=k∑​μ(k)i=1∑⌊kn​⌋​j=1∑⌊km​⌋​d(i)d(j)=k∑​μ(k)(i=1∑⌊kn​⌋​d(i))⋅(j=1∑⌊km​⌋​d(j))
线性筛出 μ,d\mu,dμ,d,预处理出前缀和,整除分块即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
const int N=1e5+100;
int n,m;int p[N],tot,vis[N],mu[N],msum[N],d[N];
ll dsum[N];
void init(int n){mu[1]=1;d[1]=1;for(int i=2;i<=n;i++){if(!vis[i]) p[++tot]=i,mu[i]=-1,d[i]=2;for(int j=1;j<=tot&&p[j]<=n/i;j++){vis[i*p[j]]=1;if(i%p[j]==0){mu[i*p[j]]=0;d[i*p[j]]=d[i]+d[i]-d[i/p[j]];break;}mu[i*p[j]]=-mu[i];d[i*p[j]]=d[i]*2;}}for(int i=1;i<=n;i++){msum[i]=msum[i-1]+mu[i];dsum[i]=dsum[i-1]+d[i];}return;
}signed main() {#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifinit(5e4);int T=read();while(T--){n=read();m=read();ll ans(0);for(int l=1,r;l<=min(n,m);l=r+1){r=min(n/(n/l),m/(m/l));ans+=(msum[r]-msum[l-1])*dsum[n/l]*dsum[m/l];}printf("%lld\n",ans);}return 0;
}
/*
5
5
8
1
46
3564
*/

洛谷P3327:[SDOI2015]约数个数和(莫比乌斯反演)相关推荐

  1. P3327 [SDOI2015]约数个数和 (mobius反演)

    P3327 [SDOI2015]约数个数和 推导过程 求∑i=1n∑j=1md(ij)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} d(ij)∑i=1n​∑j=1m​d(ij ...

  2. 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演

    [BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数 ...

  3. 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演

    题目描述 设d(x)为x的约数个数,给定N.M,求   输入 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. 输出 T行,每行一个整数,表示你 ...

  4. BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)

    题目大意:略 洛谷传送门 首先要知道这样一个公式不知道这个公式这道题还怎么做... $d(ij)=\sum\limits_{x=1}^{i} \sum\limits_{y=1}^{j}[gcd(x,y ...

  5. BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]

    2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...

  6. P3327 [SDOI2015]约数个数和

    P3327 [SDOI2015]约数个数和 题意: 设 d(x) 为 x 的约数个数,给定 n,m,求 ∑i=1n∑j=1md(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}d(i, ...

  7. luogu P3327 [SDOI2015]约数个数和(rng58-clj等式)

    luogu P3327 [SDOI2015]约数个数和(rng58-clj等式) 题目大意 设d(x)d(x)d(x)为x的因子的个数,给出N和M求 ∑i=1n∑j=1md(i,j)\sum_{i=1 ...

  8. 并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和

    题目大意 设d(x)为x的约数个数,\(t\)组询问,给定\(n,m\)(\(t,m,n\leq5*10^4\)),求$ \sum^n_{i=1}\sum^m_{j=1}d(i*j)$ 题解 假设\( ...

  9. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...

  10. 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演

    求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...

最新文章

  1. python的zip函数
  2. Python入门100题 | 第011题
  3. Microsoft CryptoAPI加密技术(一)
  4. 关于iis中的网站,在ie下点击服务器控件无反应的问题
  5. python3 匹配空格 正则_玩转正则表达式
  6. 花体英文字帖pdf可打印_考研政治 | 马原24个主观题答题原理!PDF可打印!
  7. mysql/mariadb应该使用utf8mb4而不是utf8
  8. Android数据库 分页查询,Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据(转)...
  9. 发明者本地回测平台python版[博]
  10. 1.1 echo rem cd dir命令
  11. 2020年互联网大厂中秋礼盒PK!看看你的礼盒怎么样
  12. win10 双屏 窗口显示快捷键
  13. java.gg_JAVA公文管理系统
  14. 腾讯的天天快报凭什么想挑战今日头条?
  15. 国标28181:jrtplib从编译到使用
  16. java基于微信小程序的游戏外包管理信息系统 uniapp 小程序
  17. 独立IP、PV、UV、DAU含义
  18. learnpythonthehardway下载_只需十四步:从零开始掌握Python机器学习(附资源)
  19. 圣斗士星矢游戏抽奖计算机怎么计算,圣斗士星矢手游抽奖技巧解析 教你抽橙卡...
  20. 记一次创建radmin服务并测试成功:

热门文章

  1. 源码分享,送你一份Google Python class源码
  2. 当你老了,一生最后悔什么?大数据告诉你!
  3. sql语句ding_mybatis plus 写sql语句
  4. java中treemap释放_在Java中从TreeMap删除键
  5. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]
  6. 表达式如何获取复选框的值_Nuke表达式 Expression节点讲解
  7. php用ajaxs上传图片_jquery+ajax+php 图片上传
  8. oracle导入视图报错,exp/imp 报错处理(EXP-00003 / IMP-00019 / IMP-00058)
  9. python最大值_Python 获取最大值函数|python3教程|python入门|python教程
  10. acwing2019. 拖拉机(最短路径)