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.

InputThe 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.OutputFor each test case,output the answer on a single line.Sample Input

3
1 1
10 2
10000 72

Sample Output

1
6
260

题意:求有多少个1<=X<=N,满足gcd(X,N)>=M。

思路:即求Σd=gcd(X,N)>=M;枚举d,而d是M的因子,不超过根号N个;对枚举的d,用欧拉公式求得有多少个X满足gcd(X,N)=d;

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int p[maxn+],vis[maxn+],phi[maxn],cnt;
void getprime()
{
phi[]=;
for(int i=;i<=maxn;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&i*p[j]<=maxn;j++){
vis[i*p[j]]=; phi[i*p[j]]=phi[i]*(p[j]-);
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}
}
int tot,ans,fac[maxn];
void divide(int x)
{
for(int i=;i*i<=x;i++){
if(x%i==){
fac[++tot]=i;
if(i*i!=x) fac[++tot]=x/i;
}
}
}
map<int,int>PHI;
int getphi(int x)
{
if(x<=maxn) return phi[x];
if(PHI[x]) return PHI[x];
int res=x;
for(int i=;i*i<=x;i++)
if(x%i==) {
res=res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res=res/x*(x-);
PHI[x]=res;
return res;
}
int main()
{
getprime();
int T,N,M,i,j;
scanf("%d",&T);
while(T--){
tot=ans=;
scanf("%d%d",&N,&M);
divide(N);
for(i=;i<=tot;i++){
if(N/fac[i]>=M) ans+=getphi(fac[i]);
}
printf("%d\n",ans);
}
return ;
}

---------------------------------分界线--------------------------------

再来看HDU5514。。。(虽然复杂度看似有些巧合)。

只要枚举M的因子,然后验证如果是属于某个gcd(a,M)的倍数,就可以累加其所到位子,求和的时候利用对称性,有公式Σ=φ(x)*m/2;。

(容斥定理也可以做,但是我想不出来)。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=;
int p[maxn+],vis[maxn+],phi[maxn],cnt;
void getprime()
{
phi[]=; phi[]=;
for(int i=;i<=maxn;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&i*p[j]<=maxn;j++){
vis[i*p[j]]=; phi[i*p[j]]=phi[i]*(p[j]-);
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}
}
int tot,fac[maxn];
void divide(int x)
{
for(int i=;i*i<=x;i++){
if(x%i==){
fac[++tot]=i;
if(i*i!=x) fac[++tot]=x/i;
}
}
}
int getphi(int x)
{
if(x<=maxn) return phi[x];
int res=x;
for(int i=;i*i<=x;i++)
if(x%i==) {
res=res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res=res/x*(x-);
return res;
}
int a[maxn],N,M;
bool check(int x)
{
for(int i=;i<=N;i++)
if(x%a[i]==) return true;
return false;
}
int main()
{
getprime();
int T,Case=,i; ll ans;
scanf("%d",&T);
while(T--){
tot=ans=;
scanf("%d%d",&N,&M);
for(i=;i<=N;i++){
scanf("%d",&a[i]);
a[i]=__gcd(a[i],M);
}
divide(M);
for(i=;i<=tot;i++){
if(fac[i]!=M&&check(fac[i])) ans+=(ll)getphi(M/fac[i])*M/;
}
printf("Case #%d: %lld\n",++Case, ans);
}
return ;
}

从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)的更多相关文章

  1. HDU5514 Frogs

    /* HDU5514 Frogs http://acm.hdu.edu.cn/showproblem.php?pid=5514 容斥原理 * * */ #include <cstdio> ...

  2. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  3. HDU2588 GCD(欧拉函数)

    题目问[1,n]中与n的gcd大于等于m的数的个数. 好难想... 假设x满足条件,那么gcd(x,n)=d>=m,而x/d与n/d一定互质. 又x<=n,所以x/d<=n/d. 于 ...

  4. hdu2588 gcd 欧拉函数

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. HDU2588:GCD(欧拉函数的应用)

    题目链接:传送门 题目需求:Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.(2& ...

  6. hdu2588 GCD

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

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

  8. 【做题】hdu5514 Frogs——另类容斥

    题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和.(n<=10000,m<=1000000000) 直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时 ...

  9. hdu 5514 Frogs 容斥思想+gcd 银牌题

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. 一个简单的3D范例,是在别人基础上面整理的。

    一个简单的范例,是在别人基础上面整理的.原来的例子,框图太乱了,没有条理感. http://pan.baidu.com/s/1eQTyGCE

  2. (24)如何使用HttpClient

    介绍 HttpClient是HTTP客户端的接口.HttpClient封装了各种对象,处理cookies,身份认证,连接管理等. 概念 HttpClient的使用一般包含下面6个步骤: 创建 Http ...

  3. cocos代码研究(17)Widget子类RadioButtonGroup学习笔记

    理论基础 RadioButtonGroup可以把指定的单选按钮组织起来, 形成一个组, 使它们彼此交互. 在一个RadioButtonGroup, 有且只有一个或者没有RadioButton可以处于被 ...

  4. Python 日历模块calendar.monthrange 获取某一个月有多少天

    import calendar monthRange = calendar.monthrange(2018, 10) (0, 31) 输出的是一个元组: 第一个元素,数字0是这个月的第一天是星期天(上 ...

  5. SQL case when 多条件查询

    基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.下面给个简单示例:

  6. 前端学习笔记之HTTP协议

    阅读目录 一 HTTP协议简介 二 HTTP协议之请求Request 三 HTTP协议之响应Response 四 HTTP协议完整工作流程 五 HTTP协议关键性总结 六 自定义套接字分析HTTP协议 ...

  7. vue.js指令v-model实现方法

    原文链接:http://www.jb51.net/article/99097.htm V-MODEL 是VUE 的一个指令,在input 控件上使用时,可以实现双向绑定. 通过看文档,发现他不过是一个 ...

  8. 生成二维码Base64图片

    这个写了,但是自己没有用,发现浏览器有的不兼容 代码: string str = System.Configuration.ConfigurationManager.AppSettings[" ...

  9. pix2pix-tensorflow搭建及其使用

    目录 pix2pix-tensorflow搭建过程 1. 环境搭建 2. 环境说明 3. 开始搭建 4. 训练结果说明 5. 数据集 5.1 图片格式说明 5.3 从先用图片创建图像对 5.4 如何进 ...

  10. SpringBoot使用Redis数据库

    (1)pom.xml文件引入jar包,如下: <dependency> <groupId>org.springframework.boot</groupId> &l ...