题面:

传送门

思路:

首先,我们需要证明一个结论:d(i*j)等于sigma(gcd(x,y)==1),其中x为i的约数,y为j的约数

对于nm的每一个质因子pi分别考虑,设n = pi^ai + n',m = pi^bi + m'

那么显然质因子pi对d(nm)的贡献为(ai+bi+1)

同理,考虑右边的式子,我们发现质数pi对右侧做的贡献仍然是(ai+bi+1),即如下的(x,y)

(pi^ai,1) (pi^(ai-1),1) ..... (1,1) .....(1,pi^(bi-1)) (1,pi^bi)

因此左右两式相同

因此原待求表达式化为如下形式:

由莫比乌斯函数第二情况得:上式可化为

其中g(i)表示前半个式子中的那段东西,相当于d(i)的前缀和

于是O(Tsqrt(min(n,m))轻松解决

顺便说一句,求约数个数也有线性的方法

记录c[i]表示i的最小的质因子的次数

每次更新这个,然后同时用c[i]+1更新d[i*pri[j]]即可

Code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll mu[],pri[],c[],d[],cnt;bool vis[];
void init(ll n){
mu[]=d[]=c[]=;ll i,j,k;
for(i=;i<=n;i++){
if(!vis[i]){
pri[++cnt]=i;mu[i]=-;c[i]=;d[i]=;
}
for(j=;(j<=cnt)&&(i*pri[j]<=n);j++){
k=i*pri[j];vis[k]=;
if(i%pri[j]==){
d[k]=d[i]/(c[i]+)*(c[i]+);
c[k]=c[i]+;break;
}
mu[k]=-mu[i];
d[k]=d[i]*d[pri[j]];c[k]=;
}
}
for(i=;i<=n;i++) mu[i]+=mu[i-];
for(i=;i<=n;i++) d[i]+=d[i-];
}
ll n,m;
int main(){
ll i,j,T=read(),ans;init();
while(T--){
n=read();m=read();ans=;
if(n>m) swap(m,n);
for(i=;i<=n;i=j+){
j=min(n/(n/i),m/(m/i));
ans+=(mu[j]-mu[i-])*d[n/i]*d[m/i];
}
printf("%lld\n",ans);
}
}

[SDOI2015][bzoj3994] 约数个数和 [莫比乌斯反演]的更多相关文章

  1. P3327 [SDOI2015]约数个数和 莫比乌斯反演

    P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...

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

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

  3. BZOJ3994: [SDOI2015]约数个数和(莫比乌斯反演)

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

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

    题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN.MMM,求 ∑i=1N∑j=1Md(ij)\sum^{N}_{i=1}\sum^{M}_{j=1} d(ij)i=1∑N​j=1∑M ...

  5. [SDOI2015]约数个数和 莫比乌斯反演

    ---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...

  6. luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演

    题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...

  7. [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)

    [BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...

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

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

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

    https://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://blog.csdn.net/qq_36808030/article/deta ...

随机推荐

  1. 查询Linux下已安装软件的版本

    #rpm -qa | grep mysql

  2. Oracle Hint 之 Parallel

    强制启用oralce的多线程处理功能. 并行查询允许将一个sql select 语句划分为多个较小的查询,每个部分的查询并发的运行,然后将各个部分的结果组合起来,提供最终的结果,多用于全表扫描,索引全 ...

  3. vue axios 攻略

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特点: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 ...

  4. JZOJ 5842

    Description 给定一个n*m 的 01 矩阵,求包含[l,r]个 1 的子矩形个数. Input 第一行,两个正整数n,m.接下来n 行,每行一个长度为 m 的 01 串,表示给定的矩阵.接 ...

  5. python面试题之介绍一下Python中webbrowser的用法

    所属网站分类: 面试经典 > python 作者:外星人入侵 链接: http://www.pythonheidong.com/blog/article/13/ 来源:python黑洞网 www ...

  6. Linux 面试的一些基础命令

    1.查询服务器负载 (1)uptime [root@oldboy ~]# uptime 20:17:18 up 7:41, 2 users, load average: 0.00, 0.00, 0.0 ...

  7. Python入门必学:字符串和编码正确的使用方法

    字符编码,我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  8. Python入门必学:递归函数正确的操作使用方法,案例详解

    递归函数,在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以 ...

  9. for循环+canvas实现黑客帝国矩形阵

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  10. [BZOJ2947]促销(Splay)

    Description Great Bytelandish的超级市场网络请你编写一个程序模拟促销商品的成本费用(simulating costs of the promotionbeing prepa ...