博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
乞讨 间隔[a,b]在见面p^k*q*^m(k>m)中数号码
阅读量:6296 次
发布时间:2019-06-22

本文共 1319 字,大约阅读时间需要 4 分钟。

标题叙述性说明:

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 
#include
#include
#include
#include
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;}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
CNC加工中心刀柄类型
查看>>
WordPress设计bug+WooCommerce漏洞导致网站存在被劫持风险
查看>>
新品【国内动态】服务器列表
查看>>
10月个人考核
查看>>
离线数据处理与流数据处理的区别
查看>>
照相功能
查看>>
MATLAB编程与应用系列-第2章 数组及矩阵的创建及操作(4)
查看>>
变频电源要怎么测定额定容量
查看>>
git 使用笔记 oschina ,mac
查看>>
盒子模型
查看>>
Windows平台的Eclipse-javaEE-mars相关配置
查看>>
Oracle导入导出
查看>>
每日一学|数据中心spine leaf网络架构
查看>>
DockerSwarm 微服务部署
查看>>
Spring Boot 配置文件详解
查看>>
安装python3.6-pyppeteer
查看>>
yum源简单介绍及本地yum源的搭建
查看>>
java中事务的介绍
查看>>
Java常用实体类--System类
查看>>
Mysql按周,按月,按日,按小时分组统计数据
查看>>