[SDOI2015]约数个数和
Sol
首先有个结论
\(\sum_{i=1}^{m}\sum_{j=1}^{n}d(i*j)=\sum_{i=1}^{m}\sum_{j=1}^{n}\sum_{x|i}\sum_{y|i}[gcd(x,y)==1]\)
证明:可以看po姐的博客
接着这个式子推
=\sum_{x=1}^{n}\sum_{y=1}^{m}[gcd(x, y)==1\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor]\\
设f(i)=\sum_{x=1}^{n}\sum_{y=1}^{m}[gcd(x, y)==i\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor]\\
设g(i)=\sum_{x|d}f(d)
\]
f(i)可以通过莫比乌斯反演求出
考虑求g(i)
=\sum_{i|x}\sum_{i|y}\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\\
=\sum_{x=1}^{\lfloor\frac{n}{i}\rfloor}\sum_{y=1}^{\lfloor\frac{m}{y}\rfloor}\lfloor\frac{n}{x*i}\rfloor\lfloor\frac{m}{y*i}\rfloor\\
换个元=\sum_{i=1}^{x}\sum_{j=1}^{y}\lfloor\frac{x}{i}\rfloor\lfloor\frac{y}{j}\rfloor\\
\]
这个东西\(\sum_{i=1}^{x}\lfloor\frac{x}{i}\rfloor\)就是每个数的倍数的个数和的和,就是每个数约数的个数和的和预处理一下,前缀和一下就好,于是每个g(i)就可以O(1) 求。。。(约数的个数是积性函数,也可以线性筛)
数论分块什么的就不说了
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(5e4 + 1);
IL ll Read(){
char c = '%'; ll x = 0, z = 1;
for(; c > '9' || c < '0'; c = getchar()) if(c == '-') z = -1;
for(; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
return x * z;
}
int prime[_], mu[_], d[_], pred[_], num;
bool isprime[_];
IL void Prepare(){
isprime[1] = 1; mu[1] = d[1] = 1;
for(RG int i = 2; i < _; ++i){
if(!isprime[i]){ prime[++num] = i; mu[i] = -1; d[i] = 2; pred[i] = 1; }
for(RG int j = 1; j <= num && i * prime[j] < _; ++j){
isprime[i * prime[j]] = 1;
if(i % prime[j]){ mu[i * prime[j]] = -mu[i]; d[i * prime[j]] = d[i] * 2; pred[i * prime[j]] = 1; }
else{
mu[i * prime[j]] = 0;
pred[i * prime[j]] = pred[i] + 1;
d[i * prime[j]] = d[i] / (pred[i] + 1) * (pred[i] + 2);
break;
}
}
d[i] += d[i - 1]; mu[i] += mu[i - 1];
}
}
int main(RG int argc, RG char *argv[]){
Prepare();
for(RG int T = Read(); T; --T){
RG int n = Read(), m = Read(); RG ll ans = 0;
if(n > m) swap(n, m);
for(RG int i = 1, j; i <= n; i = j + 1){
j = min(n / (n / i), m / (m / i));
ans += 1LL * (mu[j] - mu[i - 1]) * d[n / i] * d[m / i];
}
printf("%lld\n", ans);
}
return 0;
}
[SDOI2015]约数个数和的更多相关文章
- BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表 ...
- P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)
P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
3994: [SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接 ...
- 洛谷 [SDOI2015]约数个数和 解题报告
[SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...
- BZOJ 3994: [SDOI2015]约数个数和
3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 898 Solved: 619[Submit][Statu ...
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
[BZOJ3994][SDOI2015]约数个数和 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组 ...
- 洛谷P3327 - [SDOI2015]约数个数和
Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...
- P3327 [SDOI2015]约数个数和 莫比乌斯反演
P3327 [SDOI2015]约数个数和 莫比乌斯反演 链接 luogu 思路 第一个式子我也不会,luogu有个证明,自己感悟吧. \[d(ij)=\sum\limits_{x|i}\sum\li ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
- 【BZOJ】3994: [SDOI2015]约数个数和
题意: \(T(1 \le T \le 50000)\)次询问,每次给出\(n, m(1 \le n, m \le 50000)\),求\(\sum_{i=1}^{n} \sum_{j=1}^{m} ...
随机推荐
- String,StringBuffer,StringBuilder的区别
数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 比如数据库就是对硬盘中的数据进行有规则的管理,可以进行增删改查工作,而良好的数据结构可以优化这些操作, 也许大家会想这些和St ...
- angular+require前端项目架构搭建
app //应用入口 directive //自定义指令 require-main //require的主配置文件 存放公共调用的js service //请求后端数据公有类 controllers ...
- EntityFrameWork实现部分字段获取和修改(含源码)
EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的.以下介绍的2个功能点分别是部分字段更新和获取 解决部分字段Update.本方案采用仓储模 ...
- Shiro笔记--shiroFilter权限过滤
1.shiro中shiroFilter中的一些配置页面的过滤权限 <!--名字必须和web.xml里面的filter-name一样--> <bean id="shiroFi ...
- 在linux ubuntu下搭建深度学习/机器学习开发环境
一.安装Anaconda 1.下载 下载地址为:https://www.anaconda.com/download/#linux 2.安装anaconda,执行命令: bash ~/Downloads ...
- POJ - 2492 种类并查集
思路:保存每个点与其父节点的关系,注意合并和路径压缩即可. AC代码 #include <cstdio> #include <cmath> #include <cctyp ...
- python-scrapy的编码问题
在学习scrapy中,遇到编码问题还是很头痛的问题的.由于对于语言的对不熟悉,加上不会思考的去解决问题.这样盲目的实践似乎就是在浪费时间. 用心思考一下是非常重要的一个过程,在没有办法前进的时候,先学 ...
- DataTable筛选某列最大值
dt.Compute("max(列名)",""); Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式, ...
- Ubuntu版本更替所引发的“血案”
Ubuntu版本更替所引发的"血案" 今天,我兴致很高的装了双系统,并且配置了Linux的网络,接下来就是安装一些软件,来实现我想达到的功能了,结果被一个小小的命令卡的 ...
- 2_成员函数(Member Functions)
成员函数以定从属于类,不能独立存在,这是它与普通函数的重要区别.所以我们在类定义体外定义成员函数的时候,必须在函数名之前冠以类名,如Date::isLeapYear().但如果在类定义体内定义成员函数 ...