http://acm.hdu.edu.cn/showproblem.php?pid=1695
1 /**
大意: a<=x<=b , c<= y <= d ,求在此范围内 有多少组x,y 满足 gcd(x,y) = k ; a=c=1(题目有问题)gcd(x,y),gcd(y,x) 算一个
思路: 也就是求 1 - - b/k, 1 -- d/k 内有多少个数互素,
1、 若k =0, 则 res =0, 因为任何两个数的gcd 不可能为 0
2、 若k !=0 , 设b = b/k, d = d/k, 默认 d>b 那么
对于1-b 之间的互质的数 就是欧拉函数,
对于b+1 -- d 从b+1 -- d 之间找一个数y, 在 1 - b 之间寻找与其互质的数。 那么 1 -b 之间的数 肯定不含有y的质因子, 那么将y 质因数分解, 在 1 -- b 之间的数,中除掉 含有 y因子的数(注意这里不只是质因子,是y所有的因子)。。 剩下的即为所求。。
---------------------------------------------------------------------------------
别人的解释
求[1..b]中的x和[1..d]中的y有多少gcd(x,y) = k.
要求gcd(x,y) = k,则等价于求 gcd(x/k,y/k) = 1.所以问题转化成求[1..b/k]和[1..d/k]中有多少对gcd(x,y) = 1. 进一步转换成 枚举[1,d]区间里的n与][1, b]的区间的数互质的个数,这里d>=b.
因为[1,b]包含在[1,d]里,所以[1,b]相当于累加欧拉函数phi(i)的值,而[b + 1, d]这个区间可以通过容斥原理来求出.
要求n与][1, b]的区间的数互质的个数,可以考虑求与n不互质数的个数v, 那么互质的数自然就是b - v.
所以分解n的素因子,考虑n的素因子pi,则[1, b]中与pi不互质的数的个数是[b/pi](即其multiples).
如果这样累加[b/pi]的话则会加上很多重复的值(一个数可能有多个素因子),这里容斥原理就派上用场了.
------------------------------------------------------------------------------------- **/ #include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const long long maxn = ;
long long phi[maxn];
long long priD[maxn];
long long len; void euler(long long n){
len =;
long long m = (long long )sqrt(n+0.5);
for(int i=;i<=m;i++) if(n%i==){
priD[len++] = i;
while(n%i==)
n = n/i;
}
if(n>)
priD[len++] = n;
} void phi_table(){
for(int i=;i<maxn;i++)
phi[i] =;
phi[] =;
for(int i=;i<maxn;i++)if(!phi[i]){
for(int j=i;j<maxn;j+=i){
if(!phi[j]) phi[j] =j;
phi[j] = phi[j] /i *(i-);
}
}
} long long solve(long long n){
long long sum =;
for(long long i=;i<1ll<<len;i++){
long long tmp =;
long long flag =;
for(int j =;j<len;j++){
if(i&(1ll<<j)){
flag ++;
tmp *= priD[j];
}
}
if(flag%)
sum += n/tmp;
else
sum -= n/tmp;
}
return sum;
} int main()
{
phi_table();
int t;
cin>>t;
int cnt;
long long a,b,c,d,k;
for(cnt =;cnt<=t;cnt++){
cin>>a>>b>>c>>d>>k;
if(k==){
cout<<"Case "<<cnt<<": "<<<<endl;
continue;
}
b = b/k;
d = d/k;
if(b>d){
swap(b,d);
}
long long res =;
for(int i=;i<=b;i++)
res += phi[i];
for(int i=b+;i<=d;i++){
euler(i);
res += (b - solve(b));
}
cout<<"Case "<<cnt<<": "<<res<<endl;
}
return ;
}

hdu1695 GCD的更多相关文章

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

    /** 题目:hdu1695 GCD 链接:http://acm.hdu.edu.cn/status.php 题意:对于给出的 n 个询问,每次求有多少个数对 (x,y) , 满足 a ≤ x ≤ b ...

  2. [hdu1695] GCD ——欧拉函数+容斥原理

    题目 给定两个区间[1, b], [1, d],统计数对的个数(x, y)满足: \(x \in [1, b]\), \(y \in [1, d]\) ; \(gcd(x, y) = k\) HDU1 ...

  3. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  4. HDU1695 GCD(莫比乌斯反演)

    传送门 看了1个多小时,终于懂了一点了 题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数 思路:令F(i)表示i|gcd(x,y)的 ...

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

    F - GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  6. hdu1695 GCD(莫比乌斯入门题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 给出n.m.k ,求出1<=x<=n, 1<=y<=m 且gcd ...

  7. hdu1695 GCD 容斥原理

    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) ...

  8. Hdu1695 GCD 2017-06-27 22:19 30人阅读 评论(0) 收藏

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: Given 5 integers: a, b, c, d, k, you're to ...

随机推荐

  1. 【Web】十步教你搭建完整免费的个人网站(花生壳+XAMPP+WordPress)

    1.从花生壳官网(http://www.oray.com/peanuthull/download.php)下载最新版本的客户端. 下载完成后安装,注册护照(需手机验证码验证),注册完成后获取免费域名并 ...

  2. ##DAY2 UILabel、UITextField、UIButton、UIImageView、UISlider

    ##DAY2 UILabel.UITextField.UIButton.UIImageView.UISlider #pragma mark ———————UILabel——————————— UILa ...

  3. C++之构造函数重载

    #include<stdio.h> class Test    {        private:         int i;         int j;         int k; ...

  4. QT中QWidget、QDialog及QMainWindow的区别

    本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...

  5. Problem D Ananagrams(map的使用)

    题目链接:Problem D 题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另一个单词.在判断是否满足条件时,字母不区分大小写. 但是输出时应保留原始大小写, ...

  6. C# Mutex

    Mutex Mutex 类似于C# lock, 区别在于一个Mutex可以在多个进程间使用.也就是说Mutex既是computer-wide又是application-wide. 注意: 获取和释放M ...

  7. IE 弹出提示:由于无法验证发布者,所以Windows 已经阻止此软件

    由于无法验证发布者,所以Windows 已经阻止此软件 按如下步骤:1.打开Internet Explorer---菜单栏点“工具”---Internet选项--安全---自定义级别---安全设置-- ...

  8. 8.PHP 教程_PHP字符串

    字符串变量用于存储并处理文本. PHP中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量中. 在下面的实例中, ...

  9. [LeetCode]题解(python):096-Unique Binary Search Trees

    题目来源: https://leetcode.com/problems/unique-binary-search-trees/ 题意分析: 给定一个整数n,返回所有中序遍历是1到n的树的可能. 题目思 ...

  10. 交换右ctrl和capslock

    记得几年前开始使用Emacs,因为使用ctrl键太频繁了,所以上网查了下解决方案,看到这篇文章 .把capslock和左ctrl交换,简直要泪流满面啊!立马照着做,从此在所有使用的电脑上都对此进行了设 ...