Problem Description
Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N.

Two integers are said to be co-prime or relatively prime if they have no common positive divisors other than 1 or, equivalently, if their greatest common divisor is 1. The number 1 is relatively prime to every integer.
 
Input
The first line on input contains T (0 < T <= 100) the number of test cases, each of the next T lines contains three integers A, B, N where (1 <= A <= B <= 10
15) and (1 <=N <= 10
9).
 
Output
For each test case, print the number of integers between A and B inclusive which are relatively prime to N. Follow the output format below.
 
Sample Input
2
1 10 2
3 15 5
 
Sample Output
Case #1: 5
Case #2: 10
Hint
In the first test case, the five integers in range [1,10] which are relatively prime to 2 are {1,3,5,7,9}.
首先感谢ACM不懈的追求大神的博客,本题解的代码是在该大神的题解的基础上完成的:http://www.cnblogs.com/jiangjing/archive/2013/06/03/3115470.html
题目大意:给定整数N,求出多少a到b区间(包含a,b,以下关于区间的描述都包括边界),有多少个数字和N互质。
思路:因为数量巨大,如果用辗转相除法会造成超时。我们应该回归互质的定义:两个数字的最大公约数为1称之为互质。故两数互质和两数不互质(印象里面好像叫做互余吧)互为独立事件(这说话的腔调真是受不了。。。)。总而言之,如果我们能求出该区间有多少个数字和N不互质就好了。
那么怎么求不互质的个数呢?(设问既有过渡的功能也有引起读者兴趣的作用,哈哈,好了不扯了),好的,我们先把问题改成求1到b区间和N不互质的个数,我们要先找出N的所有质因数,并求出这些质因数相乘可以组合成哪些数字,并求出b除以这些数字的和(不保留小数部分),并且因为有重叠的部分,我们这时候就需要用到互斥定理,例如:b=10,N=48,那么质因数为2,3。这些质因数相乘的组合有:1,2,3,6(可以选择只要其中一个数甚至不选),这时候用互斥定理,答案就是:int(10/-1)+int(10/2)+int(10/3)+int(10/-6),同理,我们可以求出1到a-1区间和N不互质的个数。
最难的骨头啃下来了,我们可以求出答案,假设1到b区间和N不互质的个数为f(b),假设1到a-1区间和N不互质的个数为f(a-1),那么题目的答案就是b-f(b)-(a-1-f(a-1)),好的,此处应该有掌声.
//hud 4135
#include<cstdio>
#include<iostream>
#include<vector>
#define maxn 100005
using namespace std;
vector <__int64> factor;
__int64 p[maxn];
int len_p;
void getfactor(__int64 x)
{
factor.clear();
for(__int64 i = 2; i * i <= x; i ++)
{
if(x % i == 0)
{
factor.push_back(i);
while(x % i == 0)
{
x /= i;
}
}
}
if(x > 1)
{
factor.push_back(x);
}
}
void getp()
{
p[0] = -1;
len_p = 1;
int len_factor = factor.size();
for(__int64 i = 0; i < len_factor; i ++)
{
int k = len_p;
for(__int64 j = 0; j < k; j ++)
{
p[len_p ++] = factor[i] * p[j] * (-1);
}
}
}
__int64 f(__int64 x)
{
__int64 ans = 0;
for(int i = 1; i < len_p; i ++)
{
ans += (x / p[i]);
}
return ans;
}
int main()
{
int d,cas = 1;
cin >> d;
while(d --)
{
__int64 a, b, n;
scanf("%I64d%I64d%I64d", &a, &b, &n);
getfactor(n);
printf("Case #%d: ", cas ++);
getp();
cout << b - f(b) - (a - 1 - f(a - 1)) << endl;
}
return 0;
}
/*
2
1 10 2
3 15 5
ans:5 10
*/

hdu4135题解 容斥的更多相关文章

  1. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  2. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  3. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  4. 【hdu4135】【hdu2841】【hdu1695】一类通过容斥定理求区间互质的方法

    [HDU4135]Co-prime 题意 给出三个整数N,A,B.问在区间[A,B]内,与N互质的数的个数.其中N<=10^9,A,B<=10^15. 分析 容斥定理的模板题.可以通过容斥 ...

  5. 【题解】Counting D-sets(容斥+欧拉定理)

    [题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...

  6. 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)

    [题解]CF559C C. Gerald and Giant Chess(容斥+格路问题) 55336399 Practice: Winlere 559C - 22 GNU C++11 Accepte ...

  7. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

  8. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

  9. 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)

    [题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...

  10. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥

    P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...

随机推荐

  1. [FAQ] Error 1142: INDEX command denied to user

    MySQL 用户没有某个命令权限时提示的错误.具体这里提示的是没有 index 命令权限. 把某库的所有表的 index 命令授权给用户即可: grant index on xxdb.* to 'xx ...

  2. dotnet SemanticKernel 入门 将技能导入框架

    在上一篇博客中和大家简单介绍了 SemanticKernel 里的技能概念,接下来咱准备将 技能 导入到 SemanticKernel 框架里面,进行一个管道式调用 本文属于 SemanticKern ...

  3. 2018-8-10-WPF-省市县3级联动

    title author date CreateTime categories WPF 省市县3级联动 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17:2 ...

  4. netcore3.1 程序在cento8下运行selenium

    我需要在linux下运行selenium抓取数据,本人不熟悉Python,所以只能用netcore.在带linux界面上运行爬取程序,驱动chromedriver比较简单.界面化安装好chrome,下 ...

  5. docker 安装nginx 配置目录挂载

    目录 nginx 的安装 运行mynginx容器 设置开机自动启动容器 nginx 的安装 mkdir /usr/local/docker cd /usr/local/docker docker ru ...

  6. cesium常见问题和解决

  7. Linux(三):Linux的目录及相关作用

    使用 Linux,不仅限于学习各种命令,了解整个 Linux 文件系统的目录结构以及各个目录的功能同样至关重要.使用 Linux 时,通过命令行输入 ls -l / 可以看到,在 Linux 根目录( ...

  8. C语言:send + more = money,单词相加求解字母数字谜问题

    我用的是穷举法,虽然有点笨,但是在想不到其他更好的方法对我而言就是穷举法. 有程序员大大想到其他方法也可以私信我一起探讨一下~ #include<stdio.h> int main() { ...

  9. Ubuntu Snap 简述

    Ubuntu Snaps Ubuntu Snaps 是 Ubuntu 的母公司 Canonical 于 2016 年 4 月发布 Ubuntu16.04 LTS(LongTermSupport,长期支 ...

  10. Python作图三维等高面

    技术背景 对于等高线,大家都是比较熟悉的,因为日常生活中遇到的山体和水面,都可以用一系列的等高线描绘出来.而等高面,顾名思义,就是在三维空间"高度一致"的曲面.当然了,在二维平面上 ...