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. EditPlus 4.3.2487 中文版已经发布(11月12日更新)

    新的版本修复了粘贴多重选择文本的问题,以及增加了横向扩展列选模式选择范围的快捷键(Ctrl+Alt+→/←).

  2. 微信小程序中公用内容

    微信小程序中各个页面调用公用的js 在util.js文件中 // 跳转哪里 function go(where) { wx.reLaunch({ url: where, }) } // 将方法暴露出去 ...

  3. python中 @property

    考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self.score = ...

  4. PHP设计模式_适配器模式

    将各种截然不同的函数接口封装成统一的API. PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API.类似的场景还有cache适 ...

  5. impress.js初体验——前端装X利器

    impress.js 是国外一位开发者受 Prezi 启发,采用 CSS3 与 JavaScript 语言完成的一个可供开发者使用的表现层框架(演示工具).其功能包括画布的无限旋转与缩放,任意角度放置 ...

  6. VS+SVN版本控制

    1.下载VisualSVN工具并安装 https://www.visualsvn.com/visualsvn/download/ 2.将代码传到svn服务器中 3.查看项目svn地址,直接项目右键属性 ...

  7. ZOJ 2314 Reactor Cooling(无源汇上下界网络流)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题意: 给出每条边流量的上下界,问是否存在可行流,如果存在则输出. ...

  8. /msgsrvmgr.cpp:4:26: fatal error: kdl/frames.hpp: No such file or directory #include <kdl/frames.hpp>

    /home/xxx/ros_workspace/src/bp_protocol_bridge/protospot/src/msgsrvmgr.cpp::: fatal error: kdl/frame ...

  9. thinkphp3.2笔记(5)创建项目 创建模型 实例化

    一 创建项目 1 拷贝框架 目录   public   thinkphp  .htaccess  index.php    [application不用拷贝,会自动生成] 2   public 下面创 ...

  10. mongo学亮的分享

    # MongoDB 集群部署## 关键词* 集群* 副本集* 分片## MongoDB集群部署>今天主要来说说Mongodb的三种集群方式的搭建Replica Set副本集 / Sharding ...