[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[ ...
随机推荐
- servlet生成验证码代码
package forward; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt ...
- 如何停止处于stopping状态的windows服务
工作中有时需要启动和停止windows service,有时候会出现服务处于stopping或者starting的状态,但是,在services界面中,start service/stop servi ...
- appium框架感悟
个人觉得 所谓框架 最终结果就是对存放的元素进行处理 从底层获取数据 往上层传输数据过程中 对其一步一步的封装 由繁到简 再由繁至简
- Unsupported major.minor version ... JDK具体对应版本
java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher : Unsupported major.minor version 5 ...
- MT【59】一道迭代函数作图
[Read a good book, that is conversation with many a noble man.]---勒内·笛卡尔(1596-1650) 解答: 评:也可以把f(f(x) ...
- HNOI2017礼物
礼物 这估计是最水,最无脑的一道题了 首先发现总和最接近时答案最小 发现答案就是\((\sum_{i=1}^{n}a[i]^2+b[i]^2)-2*max(\sum_{i=1}^{n}a[i]*b[i ...
- 自学Zabbix8.1 Regular expressions 正则表达式
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix8.1 Regular expressions 正则表达式 1. 配置 点击Adm ...
- 自学Zabbix12.5 Zabbix命令-zabbix_proxy
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix12.5 Zabbix命令-zabbix_proxy 1. zabbix prox ...
- 洛谷 P3871 [TJOI2010]中位数 解题报告
P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...
- 洛谷 P2491消防 解题报告
P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...