bzoj 2301
一道莫比乌斯反演入门题。
首先观察题目要求:的数对数
首先可以发现,这个东西同时有上界和下界,所以并不是很容易计算
那么我们变下形,可以看到:原式=
是不是清晰很多了?(当然没有!)
不,这一步很重要的目的在于消去了下界,使得我们的计算更方便了。
而且可以发现这四个式子的形式是一样的,所以我们对一个式子进行研究就可以了。
那么问题就变成了这样:
求满足的数对数
那么我们再进行研究,可以发现:如果有gcd(i,j)==k,那么一定有gcd(i/k,j/k)==1!
于是我们用i/k替代i,j/k替代j,原式就变为求的数对数
接下来我们考虑计算方法:
首先,如果两个式子的上界相等,则可以直接利用欧拉函数计算
但很不幸的是,上界并不相等,所以我们需要换一种方法做。
接下来进行一些推导:
设数论函数为单位元函数(即
),那么可以立刻得到:
基于这一点,我们把上面的[gcd(i,j)==1]进行变形可得:
原式=
这样的话,实际我们只是在研究对于每个d,被统计了多少次!
这样问题就变得简单了:我只需统计对于每个d,有多少个i和j同时是d的倍数即可
而我们知道,在[1,n]范围内,数d的倍数的个数=[n/d]
因此原式立刻变成了:
(注意这里的上界应该是n/k,m/k中较小者)
按理说算到这里就差不多了,可以直接O(n)出解,但是这道毒瘤题居然有多组询问!
这样考虑询问的个数的话时间是不够的。
于是我们还需要优化。
很幸运的是,我们发现表达式中有[n/kd][m/kd]这两个东西
我们知道,对于两个数n,m,在x∈[1,min(n,m)]范围内,[n/x]*[m/x]的取值个数是根号级别的!
这样的话我们只需找出所有这些取值(很显然每一个取值的取等区间都是连续的),然后对应地乘上莫比乌斯函数的前缀和就可以了!
贴代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
int T;
int pri[50005];
bool used[50005];
int miu[50005];
int smiu[50005];
int cnt=0;
int a,b,c,d,k;
void init()
{
miu[1]=1;
for(int i=2;i<=50000;i++)
{
if(!used[i])
{
pri[++cnt]=i;
miu[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<=50000;j++)
{
used[i*pri[j]]=1;
if(i%pri[j]==0)
{
miu[i*pri[j]]=0;
break;
}
miu[i*pri[j]]=-miu[i];
}
}
for(int i=1;i<=50000;i++)
{
smiu[i]=smiu[i-1]+miu[i];
}
}
ll solve(ll x,ll y)
{
ll ans=0;
if(x>y)
{
swap(x,y);
}
x/=k,y/=k;
int last=0;
for(int i=1;i<=x;i=last+1)
{
last=min(x/(x/i),y/(y/i));
ans+=(smiu[last]-smiu[i-1])*(x/i)*(y/i);
}
return ans;
}
int main()
{
scanf("%d",&T);
init();
while(T--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%lld\n",solve(b,d)-solve(a-1,d)-solve(b,c-1)+solve(a-1,c-1));
}
return 0;
}
bzoj 2301的更多相关文章
- 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)
首先我们来看一道题 BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...
- [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[ ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- bzoj 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...
- BZOJ 2301 Problem b
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 冬令营听了莫比乌斯,这就是宋老师上课讲的例题咯[今天来实现一下] #include& ...
- BZOJ 2301 Problem b(莫比乌斯函数)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2301 题意:每次给出a,b,c,d,K.求有多少数对(x,y)满足a<=x< ...
- BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1007 Solved: 415[Submit][ ...
- BZOJ 2301 Problem B(莫比乌斯反演)
http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:给a,b,c,d,k,求gcd(x,y)==k的个数(a<=x<=b,c&l ...
- BZOJ 2301: [HAOI2011]Problem b( 数论 )
和POI某道题是一样的... http://www.cnblogs.com/JSZX11556/p/4686674.html 只需要二维差分一下就行了. 时间复杂度O(MAXN + N^1.5) - ...
- BZoj 2301 Problem b(容斥定理+莫比乌斯反演)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 7732 Solved: 3750 [Submi ...
随机推荐
- Python 爬虫五 进阶案例-web微信登陆与消息发送
首先回顾下网页微信登陆的一般流程 1.打开浏览器输入网址 2.使用手机微信扫码登陆 3.进入用户界面 1.打开浏览器输入网址 首先打开浏览器输入web微信网址,并进行监控: https://wx.qq ...
- D - Stone Division HackerRank - stone-division (博弈+搜索)
题目链接:https://cn.vjudge.net/problem/HackerRank-stone-division 题目大意:给你n,m,然后是m个数.每一次你可以选择一个a[i],如果能被n整 ...
- 20165221 JAVA第五周学习心得
课本知识点 内部类与异常类 内部类:在一个类中定义另一个类 特点:外嵌类的成员在内部类仍然有效,内部类也可调用外嵌类的方法,内部类的类体不能声明类变量及类方法 非内部类不能是static类 匿名类:创 ...
- python3+requests库框架设计08-发送邮件
使用python3的email模块和smtplib模块可以实现发送邮件的动能.email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并 ...
- MybatisGenerator生成的mapper 少了识别主键的方法 byPrimaryKey()
生成的文件缺少红线标注的类似方法 添加 <property name="useInformationSchema" value="true"/>即可 ...
- Linux命令之nohup和重定向
用途:不挂断地运行命令.语法:nohup Command [ Arg ... ] [ & ]描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断 ...
- 编译和运行dubbo-admin管理平台
下载 Github上下载最新的dubbo源码包并解压 修改ZooKeeper相关的配置 打开dubbo-admin/src/main/webapp/WEB-INF下的dubbo.p ...
- SQL语句常用约束类型
常用五类约束: not null:非空约束,指定某列不为空 unique: 唯一约束,指定某列和几列组合的数据不能重复 primary key:主键约束,指定某列的数据不能重复.唯一 forei ...
- 04 if条件判断 流程控制
条件判断 if 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...
- Python-数据库 基本SQL语句
1. 数据库是什么 2. MySQL安装 3. 用户授权 4. 数据库操作 - 数据表 - 数据类型 - 是否可以为空 - 自增 - 主键 - 外键 - 唯一索引 数据行 增 删 改 查 排序: or ...