[POI2007]ZAP-Queries (莫比乌斯反演+整除分块)
[POI2007]ZAP-Queries

$ solution: $
唉,数论实在有点烂了,昨天还会的,今天就不会了,周末刚证明的,今天全忘了,还不如早点写好题解。
这题首先我们可以列出来答案就是:
$ ans=\sum_{i=1}{a}{\sum_{j=1}{b}{[gcd(i,j)==d]}} $
我们发现后面那个东西(只有 $ gcd(i,j)d $ 时才为一)跟莫比乌斯很像,莫比乌斯是(只有 $ n $ 1 才为一),所以我们再尝试转化一下(把d转化成1):
$ ans=\sum_{i=1}{\frac{a}{d}}{\sum_{j=1}{\frac{b}{d}}{[gcd(i,j)==1]}} $
于是我们就可以把后面那个东西用莫比乌斯函数的第一条性质转换成这样:
$ ans=\sum_{i=1}{\frac{a}{d}}{\sum_{j=1}{\frac{b}{d}}{\sum_{k|gcd(i,j)}{\mu(k)}}} $
但是这样显然还不够,我们想办法把莫比乌斯的式子挪到前面去:
$ ans=\sum_{k}{min(a,b)}{\mu(k)}{\sum_{i=1}{\frac{a}{d}}{\sum_{j=1}^{\frac{b}{d}}{[k|gcd(i,j)]}}} $
这个其实就相当于我们从小到大枚举k,但是我们是从上面那个式子转化过来的,所以必须满足 $ [k|gcd(i,j)] $ 这个条件。好了,现在我们肉眼观察一下,发现如下的东西:
$ {\sum_{i=1}{\frac{a}{d}}{\sum_{j=1}{\frac{b}{d}}{[k|gcd(i,j)]}}}=\lfloor \frac{\lfloor \frac{a}{d} \rfloor}{k} \rfloor \times \lfloor \frac{\lfloor \frac{b}{d} \rfloor}{k} \rfloor=\lfloor \frac{a}{d\times k} \rfloor \times \lfloor \frac{b}{d\times k} \rfloor $
$ ans=\sum_{k}^{min(a,b)}{\mu(k)\times \lfloor \frac{a}{d\times k} \rfloor \times \lfloor \frac{b}{d\times k} \rfloor} $
然后我们发现这样子的复杂度是 $ O(min(a,b)) $ 的,然而它的询问次数太多。于是出现了一个很奇妙的东西:整除分块(又叫数论分块)。举个栗子:
$ \frac{10}{1}=10 $
$ \frac{10}{2}=5 $
$ \frac{10}{3}=3 $
$ \frac{10}{4}=\frac{10}{5}=2 $
$ \frac{10}{6}=\frac{10}{7}=\frac{10}{8}=\frac{10}{9}=\frac{10}{10}=1 $
我们发现分子相同分母越大,则出现相同结果的概率越高,所以我们可以一次求出某一段相同结果的左端点和右端点(假设这一段的结果都为y,则这一段的最右端就是用分子除以y得到的值),从而使算法效率变高,这就是整除分块。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int Q;
int pr[50005];
int mu[50005];
bool use[50005];
inline int min(const rg &x,const rg &y){
if(x<y)return x; else return y;
}
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline void get_mu(int x){
rg t=0; mu[1]=1;
for(rg i=2;i<=x;++i){
if(!use[i])mu[i]=-1,pr[++t]=i;
for(rg j=1;j<=t;++j){
if(i*pr[j]>x)break;
use[i*pr[j]]=1;
if(!(i%pr[j]))break;
else mu[i*pr[j]]=-mu[i];
}
}
for(rg i=2;i<=x;++i) mu[i]+=mu[i-1];
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
Q=qr();
get_mu(50000);
while(Q--){
rg a=qr(),b=qr(),k=qr();
a/=k; b/=k;
rg r,n=min(a,b),ans=0;
for(rg l=1;l<=n;l=r+1){
r=min(a/(a/l),b/(b/l));
ans+=((a/l)*(b/l)*(mu[r]-mu[l-1]));
}printf("%d\n",ans);
}
return 0;
}
[POI2007]ZAP-Queries (莫比乌斯反演+整除分块)的更多相关文章
- [P4450] 双亲数 - 莫比乌斯反演,整除分块
模板题-- \[\sum\limits_{i=1}^a\sum\limits_{j=1}^b[(i,j)=k] = \sum\limits_{i=1}^a\sum\limits_{j=1}^b[k|i ...
- Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...
- 莫比乌斯反演&整除分块学习笔记
整除分块 用于计算$\sum_{i=1}^n f(\lfloor{n/i} \rfloor)*i$之类的函数 整除的话其实很多函数值是一样的,对于每一块一样的商集中处理即可 若一个商的左边界为l,则右 ...
- 洛谷 P2257 - YY的GCD(莫比乌斯反演+整除分块)
题面传送门 题意: 求满足 \(1 \leq x \leq n\),\(1 \leq y \leq m\),\(\gcd(x,y)\) 为质数的数对 \((x,y)\) 的个数. \(T\) 组询问. ...
- 【BZOJ1101】[POI2007] Zap(莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]\). 一道类似的题目 推荐先去做一下这道题:[洛谷2257]YY的GCD,来初步了解一下莫比乌 ...
- 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块
https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...
- [国家集训队] Crash的数字表格 - 莫比乌斯反演,整除分块
考虑到\(lcm(i,j)=\frac{ij}{gcd(i,j)}\) \(\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\) \(\sum_{d=1}^{n} ...
- 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)
洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...
- P2568 莫比乌斯反演+整除分块
#include<bits/stdc++.h> #define LL long long using namespace std; ; bool vis[maxn]; int prime[ ...
随机推荐
- JDK8字符串拼接的正确姿势
1. 对列表中的元素进行拼接 以前,对一个列表中的字符串进行拼接时,常见的代码如示例1所示: 代码示例1 List<String> ids = ImmutableList.of(" ...
- BZOJ3669[Noi2014]魔法森林——kruskal+LCT
题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住 ...
- BZOJ3862Little Devil I——树链剖分+线段树
题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...
- ssm 整合 redis(进阶教程)
最后我建议大家使用 Spring StringRedisTemplate 配置,参阅: http://blog.csdn.net/hanjun0612/article/details/78131333 ...
- Assign the task HDU - 3974(dfs序+线段树)
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- day9 函数练习题
写代码,接受n个数字,求这些数字的和 def sum_func(*args): total = 0 for i in args: total+=i return total print(sum_fun ...
- 03 Zabbix4.0添加cisco交换机基本监控步骤
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 03 Zabbix4.0添加cisco交换机基本监控步骤 主题监控一台cisco网络设备的6项内容 ...
- 自学Linux Shell8.2-linux逻辑卷LVM管理
点击返回 自学Linux命令行与Shell脚本之路 8.2-linux逻辑卷LVM管理 Linux逻辑卷管理器软件包用来通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间. 1. 逻辑卷L ...
- SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
虽然 JQuery 也能通过授权header实现跨域, 但SharePoint 提供了更简单的方法,它被实现在SP.RequestExecutor里 .它能访问跨域的服务包括REST AP ...
- A1031. Hello World for U
Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. ...