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 ...
随机推荐
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- Android动画效果之自定义ViewGroup添加布局动画
前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...
- 设计模式(五): 简单而又不失其重要性的单例模式(Singleton Pattern)
上篇博客我们系统的介绍了三种工厂模式,今天我们就来介绍一下单例模式.单例模式虽然简单,但是还是比较重要的,是常用设计模式之一.在之前的博客<Objective-C中的单例模式>中介绍了Ob ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- 带你玩转Visual Studio
带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...
- electron之Windows下使用 html js css 开发桌面应用程序
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- ListView初探
一.ListView介绍 在Android开发中ListView是比较常用的控件,常用于以列表的形式显示数据集及根据数据的长度自适应显示. ListView通常有两个主要功能点: (1)将数据集填充到 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- 图片的赖加载(lazyLoad)
懒加载的意义(在线demo预览) 尽管很多公司的网页都有一些限制,比如页面的最大的图片大小不得大于50k,也有很多图片优化工具fis3.gulp等等,但是如果图片太多还是会影响页面的加载速度,快则几十 ...