hdu1695 GCD


  http://acm.hdu.edu.cn/showproblem.php?pid=1695
1 /**
2 大意: a<=x<=b , c<= y <= d ,求在此范围内 有多少组x,y 满足 gcd(x,y) = k ; a=c=1(题目有问题)gcd(x,y),gcd(y,x) 算一个
3 思路: 也就是求 1 - - b/k, 1 -- d/k 内有多少个数互素,
4 1、 若k =0, 则 res =0, 因为任何两个数的gcd 不可能为 0
5 2、 若k !=0 , 设b = b/k, d = d/k, 默认 d>b 那么
6 对于1-b 之间的互质的数 就是欧拉函数,
7 对于b+1 -- d 从b+1 -- d 之间找一个数y, 在 1 - b 之间寻找与其互质的数。 那么 1 -b 之间的数 肯定不含有y的质因子, 那么将y 质因数分解, 在 1 -- b 之间的数,中除掉 含有 y因子的数(注意这里不只是质因子,是y所有的因子)。。 剩下的即为所求。。
8 ---------------------------------------------------------------------------------
9 别人的解释
10 求[1..b]中的x和[1..d]中的y有多少gcd(x,y) = k.
11 要求gcd(x,y) = k,则等价于求 gcd(x/k,y/k) = 1.所以问题转化成求[1..b/k]和[1..d/k]中有多少对gcd(x,y) = 1.
12
13 进一步转换成 枚举[1,d]区间里的n与][1, b]的区间的数互质的个数,这里d>=b.
14 因为[1,b]包含在[1,d]里,所以[1,b]相当于累加欧拉函数phi(i)的值,而[b + 1, d]这个区间可以通过容斥原理来求出.
15 要求n与][1, b]的区间的数互质的个数,可以考虑求与n不互质数的个数v, 那么互质的数自然就是b - v.
16 所以分解n的素因子,考虑n的素因子pi,则[1, b]中与pi不互质的数的个数是[b/pi](即其multiples).
17 如果这样累加[b/pi]的话则会加上很多重复的值(一个数可能有多个素因子),这里容斥原理就派上用场了.
18 -------------------------------------------------------------------------------------
19
20 **/
21
22 #include <iostream>
23 #include <cmath>
24 #include <algorithm>
25 #include <cstring>
26 #include <cstdio>
27 using namespace std;
28 const long long maxn = 100050;
29 long long phi[maxn];
30 long long priD[maxn];
31 long long len;
32
33 void euler(long long n){
34 len =0;
35 long long m = (long long )sqrt(n+0.5);
36 for(int i=2;i<=m;i++) if(n%i==0){
37 priD[len++] = i;
38 while(n%i==0)
39 n = n/i;
40 }
41 if(n>1)
42 priD[len++] = n;
43 }
44
45 void phi_table(){
46 for(int i=2;i<maxn;i++)
47 phi[i] =0;
48 phi[1] =1;
49 for(int i=2;i<maxn;i++)if(!phi[i]){
50 for(int j=i;j<maxn;j+=i){
51 if(!phi[j]) phi[j] =j;
52 phi[j] = phi[j] /i *(i-1);
53 }
54 }
55 }
56
57 long long solve(long long n){
58 long long sum =0;
59 for(long long i=1;i<1ll<<len;i++){
60 long long tmp =1;
61 long long flag =0;
62 for(int j =0;j<len;j++){
63 if(i&(1ll<<j)){
64 flag ++;
65 tmp *= priD[j];
66 }
67 }
68 if(flag%2)
69 sum += n/tmp;
70 else
71 sum -= n/tmp;
72 }
73 return sum;
74 }
75
76 int main()
77 {
78 phi_table();
79 int t;
80 cin>>t;
81 int cnt;
82 long long a,b,c,d,k;
83 for(cnt =1;cnt<=t;cnt++){
84 cin>>a>>b>>c>>d>>k;
85 if(k==0){
86 cout<<"Case "<<cnt<<": "<<0<<endl;
87 continue;
88 }
89 b = b/k;
90 d = d/k;
91 if(b>d){
92 swap(b,d);
93 }
94 long long res =0;
95 for(int i=1;i<=b;i++)
96 res += phi[i];
97 for(int i=b+1;i<=d;i++){
98 euler(i);
99 res += (b - solve(b));
100 }
101 cout<<"Case "<<cnt<<": "<<res<<endl;
102 }
103 return 0;
104 }

hdu1695 GCD

时间: 2024-10-13 15:40:59

hdu1695 GCD的相关文章

hdu1695 GCD 莫比乌斯反演做法+枚举除法的取值 (5,7),(7,5)看做同一对

/** 题目:hdu1695 GCD 链接:http://acm.hdu.edu.cn/status.php 题意:对于给出的 n 个询问,每次求有多少个数对 (x,y) , 满足 a ≤ x ≤ b , c ≤ y ≤ d ,且 gcd(x,y) = k ,(5,7),(7,5)看做同一对, gcd(x,y) 函数为 x 和 y 的最大公约数. 本题默认:a = c = 1; 0 < a <= b <= 100,000, 0 < c <= d <= 100,000,

[HDU1695]GCD + [HAOI2011]Problem b + [POI2007]ZAP-Queries【莫比乌斯反演】

[HDU1695]GCD [HAOI2011]Problem b [POI2007]ZAP-Queries 令\[ans(n, m)=\sum_{i=1}^n\sum_{j=1}^m[GCD(i, j) == k]\] \[=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[GCD(i, j) == 1]\] 令\[f(d)=\sum_{i=1}^{\lfloor\frac{n}{k}\rfl

hdu1695 GCD(莫比乌斯入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 给出n.m.k ,求出1<=x<=n, 1<=y<=m 且gcd(x,y) == k 的(x,y)的对数 解析: 显然就是求 [1,n/k] 与 [1, m/k]有多少数对的最大公约数是1 莫比乌斯入门题 我们设 为满足且和的的对数 为满足且和的的对数 那么,很显然,反演后得到 我们所需要的答案便是  f(1) = ∑i=1μ(i)*(n/i)*(m/i)  ,求解这个式

hdu-1695 GCD(莫比乌斯反演)

题目链接: GCD Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem 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

HDU1695 GCD (欧拉函数+容斥原理)

求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). b和d分别除以k之后的区间里面,只需要求gcd(x, y) = 1就可以了,这样子求出的数的对数不变. 这道题目还要求1-3 和 3-1 这种情况算成一种,因此只需要限制x<y就可以了 只需要枚举x,然后确定另一个区间里面有多少个y就可以了.因此问题转化成为区间(1, d)里面与x互素的数的个数 先求出x的所有质因数,因此(1,d)区间里面是x的质因数倍数的

HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: 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. 题目又说a==c==1,所以就是求[1,b]与[1,d]中gcd等于k的个数,因为若gcd(x,y)==z,那么gcd(x/z,y/z)==1,又因为不是z的倍数的肯定不是,所以不是z的倍数的可以直接去

hdu1695 GCD(莫比乌斯反演)

题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌斯反演函数: void Init() { memset(vis,0,sizeof(vis)); mu[1] = 1; cnt = 0; for(int i=2; i<N; i++) { if(!vis[i]) { prime[cnt++] = i; mu[i] = -1; } for(int j=0;

[转] POJ数学问题

转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能完全看懂了,理解了再去做题,不要只记个公式. *简单题:(直接用套公式就可以了) pku2409 Let it Bead      http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Co

『转』数学专辑

1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能完全看懂了,理解了再去做题,不要只记个公式. *简单题:(直接用套公式就可以了) pku2409 Let it Bead   http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Color http://acm.pku.edu.cn/JudgeOnline/problem?id=2154 pku12