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

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1695

看了别人的方法才会做 参考博客http://blog.csdn.net/shiren_Bod/article/details/5787722

题意 a,b,c,d,k五个数,a与c可看做恒为1,求在a到b中选一个数x,c到d中选一个数y,使得gcd(x,y)等于k,求x和y有多少对。

首先可以想到选取的必是k的倍数,假设是x和y倍,则x和y一定是互质的在,那么就变成了求1到b/k和1到d/k的之间的互质的组数。

假设d大于b的话,可以从1到d枚举i,当i小于等于b的时候,互质的数的个数就是其欧拉函数,当i大于b的时候就不是欧拉函数了,因为与i互质的

数要不大于b,那么可以逆向思维一下,求在不大于b的数中与i互质的数,这里就要用到容斥原理,

容斥原理大致是如果被计数的事物有A、B两类,那么,A类B类元素个数总和= 属于A类元素个数+ 属于B类元素个数—既是A类又是B类的元素个数。

那么在这道题里就是;  区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的成绩的倍数个数)-(区间中i的每4个质因数的乘积)+~~~~~(这个容斥想了好一会儿才想通)

然后用dfs求容斥原理,看了别人代码才看懂,还是太菜。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 typedef long long ll;
 5 const int maxn=100010;
 6 int num[maxn],p[maxn][50];
 7 ll enul[maxn];
 8 void great(){
 9     int i,j;
10     enul[1]=1;
11     for (i=2;i<maxn;i++){
12         if (!enul[i]){
13             for (j=i;j<maxn;j+=i){
14                 if (!enul[j])
15                     enul[j]=j;
16                 enul[j]=enul[j]*(i-1)/i;
17                 p[j][num[j]++]=i;
18             }
19         }
20     }
21 }
22 int dfs(int a,int b,int c){
23     int sum=0,i;
24     for (i=a;i<num[c];i++)
25         sum+=b/p[c][i]-dfs(i+1,b/p[c][i],c);
26     return sum;
27 }
28 int main()
29 {
30     int n,a,b,c,d,k,i,t=1;
31     great();
32     scanf("%d",&n);
33     while (n--){
34         scanf("%d %d %d %d %d",&a,&b,&c,&d,&k);
35         if(k==0){
36             printf("Case %d: 0\n",t++);
37             continue;
38         }
39         b=b/k;d=d/k;
40         if (b>d) swap(b,d);
41         ll ans=0;
42         for (i=1;i<=b;i++)
43             ans+=enul[i];
44         for (i=b+1;i<=d;i++){
45             ans+=b-dfs(0,b,i);
46         }
47         printf("Case %d: %I64d\n",t++,ans);
48     }
49
50     return 0;
51 }
时间: 2024-10-05 15:55:07

hdu (欧拉函数+容斥原理) GCD的相关文章

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以

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

http://acm.hdu.edu.cn/showproblem.php? pid=1695 非常经典的题.同一时候感觉也非常难. 在区间[a,b]和[c,d]内分别随意取出一个数x,y,使得gcd(x,y) = k.问这种(x,y)有多少对.能够觉得a,c均为1,并且gcd(5,7)与gcd(7,5)是同一种. 由于gcd(x,y) = k,那么gcd(x/k,y/k) = 1.也就是求区间[1,b/k]和[1,d/k]内这种(x,y)对使得gcd(x,y) = 1. 为了防止计数反复,首先

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, y)有多少组,不考虑顺序. 思路:a = c = 1简化了问题,原问题可以转化为在[1, b/k]和[1, d/k]这两个区间各取一个数,组成的数对是互质的数量,不考虑顺序.我们让d > b,我们枚举区间[1, d/k]的数i作为二元组的第二位,因为不考虑顺序我们考虑第一位的值时,只用考虑小于i的情

hdu 1695 GCD【欧拉函数+容斥原理】

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6253    Accepted Submission(s): 2291 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

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

GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2015-01-07) 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. G

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的质因数倍数的

hdu4135--Co-prime(欧拉函数+容斥原理)

Co-prime Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2015-01-07) Description Given a number N, you are asked to count the number of integers between A and B inclusi

hdu 1695 GCD (欧拉函数、容斥原理)

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2698 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

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的倍数的可以直接去