数论好劲啊

原题:

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

1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000

gcd出现,基本上可以确定是数论了

最开始脑补了一下感觉应该是容斥之类的东西,去网上搜题解,果然是容斥(反演算是建立在整除上的容斥?

然后补习po姐的ppt,发现这题居然是第一道例题

补习了一下反演,这次和第一次学的时候不一样,证明什么的都扔掉,直接记公式应用(应试套路暴力硬肛

然后实力提升了果然不一样,现在拿起笔推公式也有感觉了

题目中要求gcd(x,y)=k的xy对数,这个可以用一个函数表示:f(k)=cnt(gcd(x,y)=k)

然后gcd是建立在整除上的,所以可以往莫比乌斯反演的方向想,尝试构造函数F(i)=cnt(i|gcd(x,y))(我说的推导过程这么有代入感其实我靠自己是根本推不出来的hhh

于是(我发现这个公式显示好像有点问题= =另存到本地即可查看)

然后就可以使用反演辣,直接从中反演出f(i)

F(i)比较容易计算

枚举i(实际上是k)的倍数即可算出答案

但是酱紫做是O(N)的,会T掉(还有n个询问)

因为可能会有很多是相等的,所以可以直接搞一个miu的前缀和,把相等的F(i)乘上miu的前缀和即可

怎么求相等的F(i)呐,每次前缀和的右端点是min(n/(n/i),m/(m/i)),左端点是上一次的右端点即可

(我说不下去了具体还是看po姐的ppt理解吧

写代码的时候又出现傻逼错误了,不过这一次很快召唤了数学大神syq帮忙查看,所以很快就找到问题了

summiu[1]没设初值……妙啊……

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int n;
int prm[],ptt=;
bool flg[];
int miu[],smmiu[];
void slct(){
memset(flg,,sizeof(flg));
miu[]=,smmiu[]=;
for(int i=;i<=;++i){
if(!flg[i]) prm[++ptt]=i,miu[i]=-;
for(int j=;prm[j]*i<= && j<=ptt;++j){
flg[prm[j]*i]=true;
if(!(i%prm[j])){ miu[i*prm[j]]=; break;}
miu[prm[j]*i]=-miu[i];
}
smmiu[i]=miu[i]+smmiu[i-];
}
}
ll cclt(int n,int m,int k){
n/=k,m/=k;
if(n>m) swap(n,m);
ll bwl=,tmp;
for(int i=;i<=n;i=tmp+){
tmp=min(n/(n/i),m/(m/i));
bwl+=(ll)(n/i)*(m/i)*(smmiu[tmp]-smmiu[i-]);
}
return bwl;
}
int main(){//freopen("ddd.in","r",stdin);
slct();
cin>>n;
int a,b,c,d,k;
while(n--){
a=rd(),b=rd(),c=rd(),d=rd(),k=rd();
printf("%I64d\n",cclt(b,d,k)+cclt(a-,c-,k)-cclt(b,c-,k)-cclt(a-,d,k));
}
return ;
}

【HAOI2011】problem b的更多相关文章

  1. 【BZOJ2301】【HAOI2011】Problem B(莫比乌斯反演)

    [BZOJ2301][HAOI2011]Problem B(莫比乌斯反演) 题面 Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...

  2. 清北学堂例题 LUOGU2519 【HAOI2011】PROBLEM A

    题目描述 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 输入格式 第一行一个整数n,接下来n行每行两个整数,第i+1行 ...

  3. 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]

    Problem b Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...

  4. BZOJ 2301 【HAOI2011】 Problem b

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  5. 【HAOI2011】problem a

    又看题解了,这样下去要跪啊QAQ 原题: 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 1≤n≤100000   0≤ ...

  6. 清北学堂例题 LUOGU2523【HAOI2011】problem c

    题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1 ...

  7. 【题解】【HAOI2011】Problem b

    \(Luogu2522\) 题目大意:求下面式子的值: \[\sum_{i=x}^n\sum_{j=y}^m[\gcd(i,j)=k] \] 这个东西直接求不好求,考虑差分,从\([1,n]\)的范围 ...

  8. 【BZOJ2998】Problem A(动态规划)

    [BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...

  9. 【HAOI2011】向量

    [题目描述] 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个 ...

随机推荐

  1. Ant在Java项目中的使用(一眼就看会)

    参考:http://www.cnblogs.com/zhengqiang/p/5557155.html Ant是跨平台的构建工具,它可以实现项目的自动构建和部署等功能.在本文中,主要让读者熟悉怎样将A ...

  2. X86汇编语言实现的贪吃蛇游戏

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 8.4 C++标准输入流

    参考:http://www.weixueyuan.net/view/6410.html 总结: 所谓标准输入是指从标准输入设备中输入设备,通常来讲我们可以将标准输入设备理解为键盘. cin是标准输入类 ...

  4. Spring学习四

    1先导入 Asject的jar包 2配置文件加入标签 ,并加入 <aop:aspectj-autoproxy proxy-target-class="true">(如果 ...

  5. WIN10-缩放与布局

    HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI230%----- 221225%----- 218220%----- ...

  6. Node.js 回调函数 1) 阻塞 ,同步 2) 非阻塞 ,异步.

    1.阻塞. 同步. 1) 读取的文件: input.txt 菜鸟教程官网地址:www.runoob.com 2) main.js var fs = require("fs"); / ...

  7. ubantu 安装redis

    安装Redis服务器端 ~ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序 检查Redis服务器系统进程 ~ ...

  8. HDU 6059 17多校3 Kanade's trio(字典树)

    Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) satisfy ...

  9. PAT 乙级 1056. 组合数的和(15)

    给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字.要求所有可能组合出来的2位数字的和.例如给定2.5.8,则可以组合出:25.28.52.58.82.85,它们的和为330. 输入 ...

  10. Python 使用sqlalchemy操作MYSQL

    1. 安装sqlalchemy库 SQL操作引擎可能需要pymysql,故要安装如下两个程序 pip install sqlalchemy pip instal pymysql