求 区间[a,b]内满足p^k*q*^m(k>m)的数的个数
来源:互联网 发布:Mac svn 终端 编辑:程序博客网 时间:2024/05/18 22:44
题目描述:
1<=a,b<=10^18,p,q都是素数 2<=p,q<=10^9;
求在[a,b]内可以表示为 x*p^k*q^m k > m 的数的个数
分析:
由于要小于b,因此m一定小于 log10(b)/log10(p*q);
因此我们可以枚举m,中间计数的时候需要用到容斥。
具体看代码:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;LL mypow(LL a,int b){ LL ans = 1; while(b){ if(b&1){ ans=ans*a; b--; } b>>=1; a=a*a; } return ans;}int main(){ LL a,b,p,q; while(~scanf("%lld%lld%lld%lld",&a,&b,&p,&q)){ int mmax = log10(b*1.0)/log10(p*q*1.0)+1; LL ans = 0; for(int i=0;i<=mmax;i++){ if(mypow(p,i+1)>b*1.0/mypow(q,i))//防止爆long long break; for(int j=i+1;j<64;j++){ if(mypow(p,j)>b*1.0/mypow(q,i)) break;//防止爆long long LL tmp=mypow(p,j)*mypow(q,i); LL cnt1 = b/tmp,cnt2=(a-1)/tmp;//由于是闭区间 因此要用a-1; ans += cnt1; ans -= cnt2; ans -= cnt1/p; ans -= cnt1/q; ans += cnt1/p/q; ans += cnt2/p; ans += cnt2/q; ans -=cnt2/p/q; } } printf("%lld\n",ans); } return 0;}
0 0
- 求 区间[a,b]内满足p^k*q*^m(k>m)的数的个数
- 求m个区间中第k小的数
- HDU 2204 Eddy's 爱好(容斥原理、给定n求满足p=m^k <= n的p的个数)
- UVA 12663 (线段树区间更新+二分查找,Q次区间更新后,求满足结果大于K的个数)
- 复杂度为log(m+n)下求有序数组A和B有序合并之后第k小的数
- DP一个数k加上n次a而且乘上m次b,然后再对p取余最大
- K、M、G、T、P、E、B,你知道都是10的多少次方吗?
- POJ 2104-K-th Number(划分树)求区间内第k小的数
- 给出一个数字m,求满足m = a^3 + b^3(a,b为正整数)的所有整数对(分解素因子防超时)
- Google算法题:M-求二叉搜索树的第K小的数
- k个数相加和为m的种数
- SOJ-3010(划分树求区间内的第k个数)
- uva 10892 求a,b 最小公倍数为m a,b这样的数有多少个
- 求n个数选m个数的组合数
- 2} 求从m到n的映射的个数 0 c} n{-2 b 设m={a
- poj 2773 容斥原理求第k个与m互质的数
- poj2773求第K个与m互质的数
- POJ 2773 Happy 2006(求第k个与m互素的数)
- Gradle学习之增量式构建
- 从新人开始 一点一点的记录 ,我所学到的知识和所学会的IT技术
- Xstream相关
- Android网络连接判断与处理
- gdb查看指定地址的内容
- 求 区间[a,b]内满足p^k*q*^m(k>m)的数的个数
- 易景地球对各种浏览器的支持
- 我朋友曾问过,是“以人为镜,明得失”还是“以仁为镜,明得失”? 在我看来,以人为镜,是要让人相互对照,由此而明是非。由此而来,便可明得悉。
- github简单使用教程
- iOS 文件操作详解
- ListView不能被单击
- Gradle学习之自定义属性
- A very useful article for us about V4L2 API
- java执行linux命令-向zabbix传消息