[HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]
题面:
有洛谷就尽量放洛谷链接呗,界面友好一点
思路:
和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T
先解决一个前置问题:怎么处理a,c不是1的情况?
很简单,容斥原理搞之
我们设f(x,y)代表gcd(i,j)==e(1<=i<=x,1<=j<=y)的无序数对(i,j)的个数
那么本题答案相当于f(d,b)-f(c-1,b)-f(a-1,d)+f(a-1,c-1)
再来看反演超时的问题
我们注意到原反演过程中,f(1)==mu(i)*(d/i)*(b/i)
(对为什么这么做不太清楚的同学可移步上面HDU1695的那个链接)
对于后两项,在i很大的时候其实他们的值是基本不变动的,变化的只有mu[i]
那么我们可以利用这个过程
每一次,我们搜寻当前节点i的下一个“后两项的乘积改变了的”节点j
j的求法是min(d/(d/i).b/(b/i)),就是反过来求变化区间的大小,i越大,变化需要的时间越久
然后我们预处理mu的时候同时把mu的前缀和算出来,在上述情况下把(d/i)*(b/i)的值乘上sum[j]-sum[i-1]
循环结束以后,把i变成j+1,然后开始下一个循环,直到i的值超过min(b,d)
这就是莫比乌斯反演中的分块前缀和优化
顺便说一下,对于欧拉函数也可以利用这个优化,具体可以看这篇博客
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
bool vis[];int mu[],pri[],cnt=,sum[];
void init(){
int i=,j,k;
mu[i]=sum[i]=;
for(i=;i<=;i++){
if(!vis[i]) pri[++cnt]=i,mu[i]=-;
for(j=;j<=cnt;j++){
k=i*pri[j];if(k>) break;
vis[k]=;
if(i%pri[j]==){mu[k]=;break;}
else mu[k]-=mu[i];
}
sum[i]=sum[i-]+mu[i];
}
}
inline int read(){
int re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
inline void swap(int &l,int &r){l^=r;r^=l;l^=r;}
ll f(int l,int r){
if(l>r) swap(l,r);ll re=,i,j=;
for(i=;i<=l;i=j+){
j=min(l/(l/i),r/(r/i));
re+=(ll)(sum[j]-sum[i-])*(l/i)*(r/i);
}
// cout<<"f "<<l<<ends<<r<<ends<<re<<endl;
return re;
}
int main(){
int a,b,c,d,e,T=read();
init();
while(T--){
a=read();b=read();c=read();d=read();e=read();
if(!e){printf("%d\n",);continue;}
b/=e;d/=e;a--;c--;a/=e;c/=e;
printf("%lld\n",f(b,d)-f(a,d)-f(c,b)+f(a,c));
}
}
[HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]的更多相关文章
- BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- [bzoj2301]Problem b莫比乌斯反演+分块优化
题意: $\sum\limits_{\begin{array}{*{20}{c}}{a < = x < = b}\\{c < = y < = d}\end{array}} {\ ...
- [bzoj2301][HAOI2011]Problem B —— 莫比乌斯反演+容斥原理
题意 给定a, b, c, d, k,求出: \[\sum_{i=a}^b\sum_{j=c}^d[gcd(i, j) = k]\] 题解 为方便表述,我们设 \[calc(\alpha, \beta ...
- 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]
Problem b Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
随机推荐
- 【转】iOS开发之压缩与解压文件
ziparchive是基于开源代码”MiniZip”的zip压缩与解压的Objective-C 的Class,使用起来非常的简单方法:从http://code.google.com/p/ziparch ...
- springboot框架快速搭建
1. 新建Maven项目 spring-boot 2. pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- Shell重启Tomcat脚本
#!/bin/bash echo -e "\n\n\n" #force kill flag,if equal [f] to force kill all flag="He ...
- 零基础快速入门SpringBoot2.0教程 (三)
一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...
- js display, visible 区别
注意: display:none和visible:hidden都能把网页上某个元素隐藏起来,在视觉效果上没有区别,但是在一些DOM操作中两者有区别: display:none ---不为被隐藏的对象保 ...
- 解决: Intelij IDEA 创建WEB项目时没有Servlet的jar包
今天创建SpringMVC项目时 用到HttpServletRequest时, 发现项目中根本没有Servlet这个包, 在网上搜了一下,这个问题是因为web项目没有添加服务器导致的. 配置tomec ...
- cf550C. Divisibility by Eight(结论)
题意 给出长度为$n$的字符串,判断是否能删除一些数后被$8$整除 Sol 神仙题啊Orz 结论: 若数字的后三位能被$8$整除,则该数字能被$8$整除 证明 设$x = 10000 * a_i + ...
- python编写定时执行脚本
前几天在抓博客园文章,打算每天抓10条最新的,所以就在脚本中加了定时让它在每天凌晨四点中时执行,但是昨天发现,报错了: 显示是远程主机强制关闭了一个链接, 原因是:mysql数据库默认当连续8小时不对 ...
- UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案
题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点 ...
- Android开发——常见的内存泄漏以及解决方案(一)
0. 前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52333954 Android的内存泄漏是Android开发领域永恒的 ...