【题意】于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。n,a,b,c,d,k<=50000。

【算法】数论(莫比乌斯反演)

【题解】差分转化为询问有多少数对(x,y)满足x,y互素,1<=x<=n/k,1<=y<=m/k。

令f[x]表示gcd(a,b)=x的数对个数,F[x]表示满足 x | gcd(a,b) 的数对个数,则F[x]=Σx|df(d)。

易得F[x]=(n/x)*(m/x),那么根据莫比乌斯反演定理,f(x)=Σx|dμ(d/n)*F(d)=Σx|dμ(d/n)*(n/d)*(m/d)。

当x=1时,f(1)=Σμ(d)*(n/d)*(m/d),d=1~min(n,m),单次询问复杂度O(n)。

继续优化,n/d至多只有2*√n个取值,只要枚举这些取值后运用μ的前缀和(预处理)快速计算。

具体方法是:当前取值为n/i时,最小为i,最大为pos=n/(n/i),这m/(m/i)取min即可。

复杂度O(n√n)。

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=;
int miu[maxn],prime[maxn],tot,s[maxn],n;
bool mark[maxn];
void pre(int n){
miu[]=;
for(int i=;i<=n;i++){
if(!mark[i])miu[i]=-,prime[++tot]=i;
for(int j=;j<=tot&&i*prime[j]<=n;j++){
mark[i*prime[j]]=;
miu[i*prime[j]]=-miu[i];
if(i%prime[j]==){miu[i*prime[j]]=;break;}
}
}
for(int i=;i<=n;i++)s[i]=s[i-]+miu[i];
}
ll solve(int n,int m){
ll ans=;int pos=;
for(int i=;i<=min(n,m);i=pos+){
pos=min(n/(n/i),m/(m/i));
ans+=1ll*(s[pos]-s[i-])*(n/i)*(m/i);
}
return ans;
}
int main(){
scanf("%d",&n);
pre();
for(int i=;i<=n;i++){
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
a--;c--;a/=k;b/=k;c/=k;d/=k;
printf("%lld\n",solve(b,d)-solve(b,c)-solve(a,d)+solve(a,c));
}
return ;
}

尝试从套路的角度来推导ans=Σx|dμ(d/n)*(n/d)*(m/d)

★当x=1时,Σd|xμ(x)=1。所以gcd(a,b)=1等价于Σd|a&&d|bμ(d)。——①

$$ans=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]$$

(i,j)=k等价于(i/k,j/k)=1可以得到:——②

$$ans=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}[gcd(i,j)=1]$$

下一步代入经典gcd转μ,得到:

$$ans=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}\sum_{d|i\cap d|j}\mu (d)$$

套路化地改为枚举gcd,得到:——③

$$ans=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}\mu (d)\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}[d|i\cap d|j]$$

最后部分满足条件的数对都可以除以d,就可以压缩上标直接计算了,即:——④

$$ans=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}\mu (d)\left \lfloor \frac{n}{kd} \right \rfloor\left \lfloor \frac{m}{kd} \right \rfloor$$

【BZOJ】2301: [HAOI2011]Problem b的更多相关文章

  1. 【BZOJ】2301: [HAOI2011]Problem b(莫比乌斯+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 和这题不是差不多的嘛--[BZOJ]1101: [POI2007]Zap(莫比乌斯+分块) 唯 ...

  2. 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3585 好神的题. 但是!!!!!!!!!!!!!!我线段树现在要开8倍空间才能过!!!!!!!!!! ...

  3. 【动态规划】bzoj2298: [HAOI2011]problem a

    建模超级妙…… Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接 ...

  4. 【BZOJ】【2301】problem b

    莫比乌斯反演/容斥原理 Orz PoPoQQQ PoPoQQQ莫比乌斯函数讲义第一题. for(i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); …… ...

  5. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  6. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  7. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  8. BZOJ 2301: [HAOI2011]Problem b( 数论 )

    和POI某道题是一样的...  http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...

  9. BZOJ 2301 [HAOI2011]Problem b (分块 + 莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 6519  Solved: 3026[Submit] ...

随机推荐

  1. CentOS下php安装mcrypt扩展

    CentOS下php安装mcrypt扩展 Posted on 2012-09-12 15:27 C'est la vie 阅读(48294) 评论(3) 编辑 收藏 (以下步骤均为本人实际操作,可能与 ...

  2. Hibernate 中 load() 方法导致的 noSession 异常

    之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 下面第三种方式解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过 ...

  3. vue render function

    vue render function https://vuejs.org/v2/guide/render-function.html { // Same API as `v-bind:class`, ...

  4. 查看apk包名和Activity名

    今天遇到一个bug,比较有意思. 情景: 测试一个钻石提现功能,条件是账户里必须有价值等于或者超过50美元的钻石,才允许提现,否则无法进行下一步. 测试步骤: 提现页面输入一个小于50美元的提现金额, ...

  5. .net下使用NPOI读取Excel表数据

    这里只写MVC下的情况 public ActionResult Index() { var path = Server.MapPath(@"/content/user.xlsx") ...

  6. ZOJ2725_Digital Deletions

    题意是这样的,一开始给你一串数字,两个人轮流操作,操作可以分为两种. 1.每次修改一个数字,使其变为一个小于当前的非负数. 2.移除中间的某一个0以及0右边的所有数字. 使得所有数字消失的游戏者获胜. ...

  7. Struts创建流程

    1.启动服务,加载web.xml 并实例化StrutsPrepareAndExecuteFilter过滤器 2.在实例化StrutsPrepareAndExecuteFilter的时候会执行过滤器中的 ...

  8. Git Gerrit Repo User Manual

                      Git Repo Gerrit User Manual Revision History   Revision # Description Date Author ...

  9. 【JavaScript】Json

    一.前言        接着上一章的内容,继续js的学习. 二.内容        解析与序列化 JSON.stringify() —— 将js对象序列化为JSON字符串,接收三个参数:1.js对象2 ...

  10. 【BZOJ2138】stone(线段树,Hall定理)

    [BZOJ2138]stone(线段树,Hall定理) 题面 BZOJ 题解 考虑一个暴力. 我们对于每堆石子和每个询问,显然是匹配的操作. 所以可以把石子拆成\(a_i\)个,询问点拆成\(K_i\ ...