GCD

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3   Accepted Submission(s) : 2
Problem Description
The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor common to a and b,For example,(1,2)=1,(12,18)=6.
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.
 
Input
The first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.
 
Output
For each test case,output the answer on a single line.
 
Sample Input

3
1 1
10 2
10000 72

 
Sample Output
1
6
260
 
Source
ECJTU 2009 Spring Contest
 题目大意: 
  第一行输入T,表示有T组数据。然后每一行输入N和M,分别表示所要求数的范围为1~N,比较值为M。
 题目意思很简单,就是求解,在数的范围内X∈[1~N],存在多少个X使得GCD(X,N)>=M,统计X符合要求的个数。
 用膝盖骨想想也知道,如果直接暴力遍历N次,每次操作的复杂度高达10^9,肯定会超时的。常规的方法肯定不行。
 
 ①首先,补充一下关于GCD()的一些基础知识。
  1,如果GCD(a,b)=c,则可以知道GCD(a/c,b/c)=1;(  GCD(a,b)=c  <=>  GCD(a/c,b/c)=1  )
  2,设GCD(a,b)=c,如果想要GCD(a,b*d)=c,用①_1可知,
    只需满足GCD(a/c,(b/c)*d)=1即可(这个限制既为,满足最大公约数的要求).
 
 ②然后,我们所要求的是GCD(X,N)>=M,也就是说我们要求一个GCD(X,N)=Z,的数,
  1,如果M==1,则可以知道在[1,N]中任意数X的GCD(X,N)>=1,所以符合要求的个数为N。
  2,如果M>1,则表示我们需要找一个GCD(X,N)>1的数。这样我们就知道X肯定会是N的除了1以外的约数、
  因为,X只有是N除了1以外的约数,才可能会有GCD(X,N)>1存在。而且,GCD(N,X)=X;(约数嘛,你懂得~)
 
 ③再者,我们需要统计的数符合要求的X的个数呢?
  1,正如②_2可以知道GCD(N,X)=X,能够使得GCD()=X的数不一定只有X本身,说的正确点的应该是GCD(N,X*q)=X,
  只需要计算1~N中有多少个(X*q)即可。但是,q是有受限制的,需要满足上述①_2的要求。
         (比如:GCD(15,5)=5,GCD(15,5*3)=15;)
  2,由①_2可知,要使得GCD(N,X*q)=X,需要满足GCD(N/X,q)=1.也就是统计1~N/X中有多少个数与N/X互质。
   是不是觉得有点熟悉了的?=>求1~N中,有多少个与N互质的数,不就是欧拉函数嘛,SUM+=Eular(N/X);
 ④最后,如何不重复的统计其公约数为符合条件X的数呢?
  其实,你每次用欧拉函数统计出来的那些数,都是唯一的,如上面③_2所说的,q是有受限制的,因为这个限制,使得所求出的个数都为不重复的、所以,只需要统计N的符合要求的约数Xi,SUM+=Eular(N/Xi),既为答案、
 #include <iostream>
 #include <stdio.h>
 #include <string.h>
 using namespace std;
 int Eular(int N)
 {
     ,i;
     ;i*i<=N;i++)
     {
         )
         {
             N/=i;sign*=i-;
             )
             {N/=i;sign*=i;}
         }
     }
     )
     sign*=N-;
     return sign;
 }
 int main()
 {
     int A,B,T,i,sign;
     scanf("%d",&T);
     while(T--)
     {
         scanf("%d%d",&A,&B);
         ,sign=;i*i<=A;i++)/*分解约数*/
            )       /*分解约数,同时判断两边*/
            {           /*如果为平方数则主需要判断一次*/
                 if(i>=B)
                     sign+=Eular(A/i);
                 if((A/i)!=i&&(A/i)>=B)/*判断是否为平方数*/
                     sign+=Eular(i);
            }
         printf("%d\n",sign);/*输出答案*/
     }
     ;
 }

【hdu-2588】GCD(容斥定理+欧拉函数+GCD()原理)的更多相关文章

  1. hdu2588 GCD 给定n,m。求x属于[1,n]。有多少个x满足gcd(x,n)>=m; 容斥或者欧拉函数

    GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...

  2. [bzoj2005][Noi2010][能量采集] (容斥 or 欧拉函数)

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种 ...

  3. HDU 2588 思维 容斥

    求满足$1<=X<=N ,(X,N)>=M$的个数,其中$N, M (2<=N<=1000000000, 1<=M<=N)$. 首先,假定$(x, n)=m$ ...

  4. 【poj2154】Color Polya定理+欧拉函数

    题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题 ...

  5. HDU - 4135 Co-prime 容斥定理

    题意:给定区间和n,求区间中与n互素的数的个数, . 思路:利用容斥定理求得先求得区间与n互素的数的个数,设表示区间中与n互素的数的个数, 那么区间中与n互素的数的个数等于.详细分析见求指定区间内与n ...

  6. 【HDU4676】Sum Of Gcd(莫队+欧拉函数)

    点此看题面 大致题意: 多组询问,求\(\sum_{i=L}^R\sum_{j=i+1}^Rgcd(i,j)\). 推式子 这道题我们可以考虑,每个因数\(d\)被统计答案的次数,肯定与其出现次数有关 ...

  7. poj2154Color polya定理+欧拉函数优化

    没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻 ...

  8. poj3696 快速幂的优化+欧拉函数+gcd的优化+互质

    这题满满的黑科技orz 题意:给出L,要求求出最小的全部由8组成的数(eg: 8,88,888,8888,88888,.......),且这个数是L的倍数 sol:全部由8组成的数可以这样表示:((1 ...

  9. UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)

    题意: 求sum{gcd(i, j) | 1 ≤ i < j ≤ n} 分析: 有这样一个很有用的结论:gcd(x, n) = i的充要条件是gcd(x/i, n/i) = 1,因此满足条件的x ...

随机推荐

  1. Filewatcher

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  2. Objective-C Runtime 运行时之一:类与对象(转载)

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  3. ssh配置导致Ansible并发失败

    Ansible并发失败原因,  fork=100. 执行playbook时候没有并发 vim /usr/lib/python2.7/site-packages/ansible/runner/conne ...

  4. md5证书在window2012不能访问

    之前在window 2008使用makecert的产生的证书,部署到window 2012后,发现只有IE能访问,但是Firefox和chrome都不行.Firefox可以使用about:config ...

  5. sql 关于dblink和多条update、insert事务回滚写法

    在存储过程的编写中难免会遇到调用同库他人的proc和跨库调用proc,还有一个proc中有多条对多表进行写入和修改的语句.那么就会用到tran. 如果我们在不写try的情况下就要对每个insert,u ...

  6. 10676 涂鸦跳跃(sort)

    10676 涂鸦跳跃 该题有题解 时间限制:1000MS  内存限制:65535K提交次数:240 通过次数:19 题型: 编程题   语言: G++;GCC Description 你玩过曾经风靡一 ...

  7. 使用java写一个小白计算器

    有点小意思~ package ok; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; ...

  8. Linux系统编程初探系列之一:文件编程

    系统函数 int creat(const char* filename,mode_t mode) filename:需要创建的文件名(包含路径,缺省为当前路径) mode:创建模式 常见的创建模式有: ...

  9. Android 消息传递之Bundle的使用——实现object对象传输(一)

    UI更新--消息处理massage 对于安卓内部消息得处理,实现对界面UI得更新操作,不能在线程中直接更新ui.至于为什么不能,在学习安卓开发的时候,在线程中操作会使程序崩溃. 为什么,可以看看诸多大 ...

  10. Chapter 2 Open Book——30

    I looked down. His hands were clenched into hard fists again. 我向下看,他的双手又一次收紧握成拳头. Mr. Banner came to ...