博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1695 GCD 容斥
阅读量:5375 次
发布时间:2019-06-15

本文共 1721 字,大约阅读时间需要 5 分钟。

GCD

题目连接:

Description

Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total number of different number pairs.

Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.

Yoiu can assume that a = c = 1 in all test cases.

Input

T

a b c d k

Output

ans

Sample Input

1

1 3 1 5 1

Sample Output

9

Hint

题意

问你gcd(i,j)=k有多少对,其中b>=i>=a,d>=j>=c

其中a和c恒等于1

题解:

很显然,我们知道一个结论,gcd(i,j)=k,b>=i>=a,d>=j>=c这个恒等于

gcd(i,j)=1,b/k>=i>=1,d/k>=j>=1

然后怎么办呢?我们暴力枚举每一个1<=i<=b/k的数,看在1<=j<=d/k里面有多少个和他互质的就好了

这个我们可以用容斥来做。

代码

#include
using namespace std;const int maxn = 2e5+5;vector
pri[maxn];void pre(){ for(int i=2;i<100007;i++) { int now = i; for(int j=2;j*j<=now;j++) { if(now%j==0) { pri[i].push_back(j); while(now%j==0) now/=j; } if(now==1)break; } if(now>1) pri[i].push_back(now); }}int solve(int x,int tot){ int res = 0; for(int i=1;i<(1<
>j)&1) { num++; tmp*=pri[x][j]; } } if(num%2==1)res+=tot/tmp; else res-=tot/tmp; } return tot-res;}int main(){ pre(); int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { int a,b,c,d,k; scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); if(k==0) { printf("Case %d: 0\n",cas); continue; } b/=k,d/=k; if(b

转载于:https://www.cnblogs.com/qscqesze/p/5131930.html

你可能感兴趣的文章
VMware 12 专业版永久许可证密钥
查看>>
截断上传原理剖析
查看>>
threadlocal原理及常用应用场景
查看>>
Linux Shell常用脚本整理
查看>>
NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
查看>>
[UE4]宏
查看>>
mysql5.6快速安装及参数详解
查看>>
Servlet学习笔记
查看>>
《岛上书店》
查看>>
RAC GI安装,报"Task resolv.conf Integerity"验证失败
查看>>
UWP:可滚动的PivotHeader
查看>>
01密码强度检查_python篇
查看>>
17款社会化营销站长插件你用了么?
查看>>
hdu 2732 最大流 **
查看>>
博弈专题
查看>>
JDBC事务管理及SavePoint示例
查看>>
BZOJ5091摘苹果(概率、期望)
查看>>
phpcms之文件目录
查看>>
改进SQL Server 性能 - 索引碎片重建
查看>>
IntelliJ IDEA 查看一个类的所有继承关系图
查看>>