hdu2588 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
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 (欧拉函数)的更多相关文章
- hdu2588 gcd 欧拉函数
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- 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 ...
- HDU 2588 GCD (欧拉函数)
GCD Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status De ...
- Bzoj-2818 Gcd 欧拉函数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...
- BZOJ2818: Gcd 欧拉函数求前缀和
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...
- 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 和 ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (欧拉函数,容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- JavaScript权威设计--JavaScript函数(简要学习笔记十)
1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...
- 【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你想了解以下几件事,我建议你阅读以下这篇教程: 想知道如何写一个multipass的toon shade ...
- Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)
目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实 ...
- Linux平台 Oracle 11gR2 RAC安装Part1:准备工作
一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二.安装前期准备工作 2.1 各节点系统时间校对 2.2 各节点关闭防火墙和 ...
- Unity iOS混合开发界面切换思路
Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- Linux网络查看命令
1.ifconfig 查看当前生效的网卡. 2.ifdown ifup 网卡禁用与启动. 3.netstat -tuln 查看当前tcp/udp通讯端口连接情况. 4.netstat -an 查看当前 ...
- Linux下反弹shell的种种方式
[前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...
- 对.net 程序进行源码混淆
还是那个一卡通的程序,这几天做了一点更新. 因为里面涉及到对数据库的链接,含IP地址和账户密码,一旦被反编译窃取,则源码泄露不说,也给服务器带来一定的风险! 下载ILSpy程序,对自己开发的.net程 ...