NKOJ P3684 GCD的个数
来源:互联网 发布:cad软件是什么软件 编辑:程序博客网 时间:2024/06/04 23:18
题目导引:http://oi.nks.edu.cn/zh/Problem/Details/3684
问题描述
给定两个正整数N,M, 求满足下列两个条件的X的个数:
条件1:1<=X<=N
条件2:gcd(X,N)>=M
输入格式
一行,两个整数N和M
输出格式
一行,一个整数,表示所求结果
样例输入 1
10 2
样例输出 1
6
样例输入 2
10000 72
样例输出 2
260
提示
2<=N<=1000000000, 1<=M<=N
题目分析:
题目要求小于等于已知N的正整数I与N的最大公约数不小于M的个数。
那么,显然可以将N,I分解为他们一个公共数与其他数的乘积,
即:N=T*A,I=T*B
显然应当满足:A>=B,并且A,B互质
那么我们要求的就转化为了T>=M时B的个数了,而因为A>=B,并且A,B互质,所以这个个数就相当于φ(A)-1,而这里其实可以优化代码,进行折半查找。
我们在枚举I的时候,当I<sqrt(N),那么我们不妨假设T=N/I,当I>sqrt(N)之后,必然有对应的A=N/I,那么很显然,当N%I==0的时候,会出现T*A=N。所以我们就只需要枚举sqrt(N)种情况,而与之对应的情况就是N/I
#include <stdio.h>#include <math.h>#define LL long longusing namespace std;LL N,M;LL Ans;LL Euler(LL n)//欧拉函数 { LL res=n,a=n; for(LL i=2ll;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1); while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; }int main(){scanf("%lld%lld",&N,&M);LL I,J,K;LL Temp=sqrt(N);for(I=2ll;I<=Temp;I++)//进行查找 {if(N%I==0){if(I>=M)Ans+=Euler(N/I);if((N/I)>=M)Ans+=Euler(I);}}if(Temp*Temp==N)Ans-=Euler(Temp);//防止完全平方数重复计算 printf("%lld",Ans+1);//算上自己本身 return 0;}
阅读全文
0 0
- NKOJ P3684 GCD的个数
- HDU 5869 区间不同GCD的个数
- 对于求n个数的gcd的想法
- 求两个或N个数的最大公约数(gcd)和…
- 【ZOJ】4846 GCD Reduce(求n个数的最大公约数)
- hdu 5317 RGCDQ (素因子个数的GCD)
- zzulioj 1806: n个数的最小公倍数 (GCD)
- hdu 5869 (求区间不同gcd的个数)
- HDU 5726 区间GCD=k的个数
- nkoj 1248: 郁闷的出纳员
- NKOJ-3703 HH的项链
- NKOJ-Unknow 死亡的颂唱者
- NKOJ-Unknow 不死的 LYM
- NKOJ-Unknow 直线的交点
- CF582A给出n个数的相互GCD,求这n个数,map的使用
- !HDU 5317 求区间里两个数的质因数个数的gcd的最大值-预处理
- 【趣题】NKOJ 3730 wjj的子集序列
- 【NKOJ 1505】 何老板的考古发现
- java.net.BindException: Address already in use: JVM_Bind <null>:8080
- Eclipse下使用prefix="c"
- Hive函数大全
- 一些小基础,容易忘记得.
- Spring—ApplicationContextAware
- NKOJ P3684 GCD的个数
- 正则表达式替换括号内的内容
- 废弃的数据交互方式——jsonp、ajax长连接
- 全选操作
- JavaScript基础——实现自动登录的安全提醒
- 工具类之Javafx倒计时时钟
- 利用python 进行数据分析全书总结
- JasperReport| TTF和TTC字体介绍
- Java集合--双列集合Map