GCD

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

知识点:   欧拉函数。http://www.cnblogs.com/shentr/p/5317442.html

题解一:

当M==1时,显然答案为N。

当M!=1。  X是N的因子的倍数是 gcd(X,N)>1 && X<=N 的充要条件。so  先把N素因子分解,

N=          (e1,e2,…en 从0~ei的全排列包含了所有N的因子。)(可能表达不清,看下面。。)

()中内容相当于:

for(int i=0;i<e1;i++)

for(int j=0;j<e2;j++)

for(int k=0;k<en;k++)

x=p1^i*p2^j…pn^k

用dfs解决这个问题,得到所有N的因子。

假设N=p*d,X=q*d.若n与x的最大公约数为d,则能够推出p与q肯定是互质的,因为X<=N所以要求的就是p的欧拉函数值了,那么我们就转化成求满足:N=p*d,并且d>=N的p的欧拉函数值之和了。

如果dfs不是用的很溜的看解法二。

//解法1:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1e5; bool vis[N];
int prime[N],cnt;
void is_prime()
{
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2; i<N; i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i+i; j<N; j+=i)
vis[j]=1;
}
}
} int e[100],p[100],cnt2=0;
void fenjie(int n)
{
cnt2=0;
memset(e,0,sizeof(e));
for(int i=0; i<cnt&&prime[i]<=n; i++)
{
if(n%prime[i]==0)
{
p[cnt2]=prime[i];
e[cnt2]++;
n/=prime[i];
while(n%prime[i]==0)
{
n/=prime[i];
e[cnt2]++;
}
cnt2++;
}
}
} int Euler(int n)
{
int ans=n;
for(int i=0; i<cnt&&prime[i]<=n; i++)
{
if(n%prime[i]==0)
{
ans=ans-ans/prime[i];
while(n%prime[i]==0)
n/=prime[i];
}
}
if(n==1)
return ans;
if(n>1)
return ans-ans/n; } LL dfsans[N],cnt3=0;
void dfs(int cur,LL x)
{
if(cur==cnt2)
{
dfsans[cnt3++]=x;
return;
}
for(int i=0;i<=e[cur];i++)
{
LL ans=1;
for(int j=0;j<i;j++)
ans*=p[cur];
dfs(cur+1,x*ans);
}
} int main()
{
int t;
cin>>t;
is_prime();
while(t--)
{
LL n,m;
cin>>n>>m;
fenjie(n);
LL ans=0; cnt3=0;
dfs(0,1);
for(int i=0;i<cnt3;i++)
{
//cout<<dfsans[i]<<endl;
if(dfsans[i]>=m)
ans+=Euler(n/dfsans[i]);
}
cout<<ans<<endl;
}
}

题解二:

只是把dfs换了,其他思路和上面一样。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1e5; bool vis[N];
int prime[N],cnt;
void is_prime()
{
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<N;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i+i;j<N;j+=i)
vis[j]=1;
}
}
} int e[100],p[100],cnt2=0;
void fenjie(int n)
{
cnt2=0;
memset(e,0,sizeof(e));
for(int i=0;i<cnt&&prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
p[cnt2]=prime[i];
e[cnt2]++;
n/=prime[i];
while(n%prime[i]==0)
{
n/=prime[i];
e[cnt2]++;
}
cnt2++;
}
}
} int Euler(int n)
{
int ans=n;
for(int i=0;i<cnt&&prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
ans=ans-ans/prime[i];
while(n%prime[i]==0)
n/=prime[i];
}
}
if(n==1)
return ans;
if(n>1)
return ans-ans/n; } /*LL dfsans[N],cnt3=0;
void dfs(int cur,LL x){ if(cur==cnt2) { dfsans[cnt3++]=x; return; } for(int i=0;i<=e[cur];i++) { LL ans=1; for(int j=0;j<i;j++) ans*=p[cur]; dfs(cur+1,x*ans); } } */ int main()
{
int t;
cin>>t;
is_prime();
while(t--)
{
LL n,m;
cin>>n>>m;
fenjie(n);
LL ans=0;
/*for(int i=0;i<N;i++)
dfsans[i]=1;
cnt3=0;
dfs(0);
for(int i=0;i<cnt3;i++)
{
cout<<dfsans[i]<<endl;
if(dfsans[i]>=m)
ans+=Euler(n/dfsans[i]);
}*/
for(int i=1;i*i<=n;i++)
{
if(n%i==0)
{
if(i>=m)
ans+=Euler(n/i);
if((n/i!=i)&&(n/i>=m))
ans+=Euler(i);
}
}
cout<<ans<<endl;
}
}

GCD

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

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

hdu2588 GCD (欧拉函数)的更多相关文章

  1. hdu2588 gcd 欧拉函数

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

  2. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  3. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  4. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  5. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  6. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  7. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  8. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

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

  9. HDU 1695 GCD (欧拉函数,容斥原理)

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

  10. hdu 1695 GCD (欧拉函数+容斥原理)

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

随机推荐

  1. Android注解使用之使用Support Annotations注解优化代码

    前言: 前面学习总结了Java注解的使用,博客地址详见Java学习之注解Annotation实现原理,从本质上了解到什么注解,以及注解怎么使用?不要看见使用注解就想到反射会影响性能之类,今天我们就来学 ...

  2. Js ==和===的区别

    ===判断: Undefined === Undefined,返回 true Null === Null,返回 true null == undefined,返回 false NaN === NaN, ...

  3. SQLServer学习笔记系列1

    一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...

  4. Apworks框架实战(五):EasyMemo的领域模型设计

    在上一讲中,我们已经新建了一个聚合根对象Account,并已经可以开始设计领域模型了.在这一讲中,我们会着重介绍EasyMemo领域模型的分析和设计,并引入Visual Studio Ultimate ...

  5. Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决

    最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...

  6. [Tool] github 入手教程

    简单的介绍一下 Github 的基本操作. 主页:https://github.com/ 首先自然是在 GitHub 注册一个帐号了.然后开始正文吧. Git 基本介绍 Git 是属于分布式版本控制系 ...

  7. 一些简单的C语言算法

    1. 要求输入一个正整数,打印下述图形 输入:5 输出: * ** *** **** ***** 实现代码如下: #include <stdio.h> int main(int argc, ...

  8. 应用.Net+Consul维护RabbitMq的高可用性

    懒人学习的过程就是工作中老大让干啥让做啥就研究研究啥,国庆放假回来的周末老大通过钉钉给我布置了个任务, RabbitMQ高可用解决方案,我想说钉钉太坑了: 这是国庆过后9号周日晚上下班给的任务,我周一 ...

  9. CSS常用渐变

    边框渐变: border-image: -webkit-linear-gradient( red , blue) 30 30; border-image: -moz-linear-gradient( ...

  10. 初识html5的localStorage本地存储

    一.概述 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是 ...