[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[ ...
随机推荐
- C#中的DateTime
一.DateTime是值类型还是引用类型的探索 二.了解DateTime结构体 三.DateTime.Now和DateTime.UtcNow是怎么计算出来的 一.DateTime是值类型还是引用类型的 ...
- fix
rounds the elements of A toward zero, resulting in an array of integers. For complex A, the imaginar ...
- jenkins--java配置
进入jenkins然后-->系统配置-->Global Tool Configuration
- BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]……a[j]中第k小的数是多少(1≤k ...
- BZOJ3028 食物(生成函数)
显然构造出生成函数:则有f(x)=(1+x2+x4+……)·(1+x)·(1+x+x2)·(x+x3+x5+……)·(1+x4+x8+……)·(1+x+x2+x3)·(1+x)·(1+x3+x6+…… ...
- Dependency Walker使用说明[转]
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
- 51nod 1061 最复杂的数V2
题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...
- P1339 热浪 最短路径模板题
这么naive的题面一看就是最短路模板题~~~ ok.首先是floyd算法,tts,记得把k放在最外面就行了. #include <cstdio> #include <cstring ...
- 【洛谷P3586】LOG
题目大意:维护一个集合,支持单点修改.查询小于 X 的数的个数.查询小于 X 的数的和. 题解:学习到了动态开点线段树.对于一棵未经离散化的权值线段树来说,对于静态开点来说,过大的值域会导致不能承受的 ...
- [luogu1967][货车运输]
题目链接 题意: 其实题目的意思就是问从x到y权值最小的路的权值最大能是多少. 思路: 首先可以先把这张图变成一棵树.因为那些更小的点肯定是不跑更优秀,而且题目没有要求路程,所以生成一棵树,只要能保证 ...