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)  ,求解这个式子我们可以分块求和,复杂度为O(√n)。

最后注意由于题目要求,需要将重复的去掉。

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5
 6 using namespace std;
 7 const int maxn=100010;
 8
 9 int vis[maxn];
10 int prime[maxn];
11 int cnt;
12 int mu[maxn];
13 int sum[maxn];
14
15 void init()
16 {
17     memset(vis,0,sizeof(vis));
18     cnt=0;
19     mu[1]=1;
20     for(int i=2;i<maxn;i++)
21     {
22         if(!vis[i])
23         {
24             prime[cnt++]=i;
25             mu[i]=-1;
26         }
27         for(int j=0;j<cnt&&i*prime[j]<maxn;j++)
28         {
29             vis[i*prime[j]]=1;
30             if(i%prime[j])
31                 mu[i*prime[j]]=-mu[i];
32             else
33             {
34                 mu[i*prime[j]]=0;
35                 break;
36             }
37         }
38     }
39     sum[0]=0;
40     for(int i=1;i<maxn;i++)
41         sum[i]=sum[i-1]+mu[i];
42 }
43
44 int main()
45 {
46     int a,b,c,d,k;
47     init();
48     int T,ca=1;
49     scanf("%d",&T);
50     while(T--)
51     {
52         scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
53         printf("Case %d: ",ca++);
54         if(k==0)
55         {
56             printf("0\n");
57             continue;
58         }
59         b=b/k;
60         d=d/k;
61         if(b>d)
62             swap(b,d);
63         long long ans1=0;
64         int last;
65         for(int i=1;i<=b;i=last+1)
66         {
67             last=min(b/(b/i),d/(d/i));
68             ans1+=(long long)(sum[last]-sum[i-1])*(b/i)*(d/i);
69         }
70         long long ans2=0;
71         for(int i=1;i<=b;i=last+1)
72         {
73             last=b/(b/i);
74             ans2+=(long long)(sum[last]-sum[i-1])*(b/i)*(b/i);
75         }
76         long long ans=ans1-ans2/2;
77         printf("%lld\n",ans);
78     }
79     return 0;
80 }

时间: 2024-12-11 12:09:44

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,

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 + [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

bzoj 2820 luogu 2257 yy的gcd (莫比乌斯反演)

题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便表述,由于n和m等价,以下内容均默认n<=m 题目让我们求:$\sum_{k=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$ 容易变形为:$\sum_{k=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{k} \righ

hdu1796:容斥入门题

简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; long l

(转载)关于gcd的8题

发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题. [bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数 做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, y <= n/k的对数!所以,枚举每个质数p(线性筛素数的方法见:线性时间内筛素数和欧拉函数),然后求(x, y) = 1, 1 <= x, y <= n/p的个数.

uva 10006 数论入门题

这是一个入门的数论题目 , 只需要简单的找素数和快速幂取模 题意:输入一个数 n , 如果这个数是非素数 , 问是不是 这个2~n-1区间的所有数都满足 ? 解法:由于数据量不大 , 可以直接暴力求解 解法1: 暴力求解 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; long long prime[65010]; long long n; void init

hdu 2767 Proving Equivalences(强连通入门题)

1 /************************************************* 2 Proving Equivalences(hdu 2767) 3 强连通入门题 4 给个有向图,求至少加多少条边使得图是所有点都是强连通的 5 由a->b->c->a易知n个点至少要n条边,每个出度和入度都要大 6 于1.先求所有所有强连通分量,把每个强连通分量看成一个点 7 在找每个点的出度和入度,最后还差的出度和入度的最大值就是 8 答案. 9 10 ************

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t