博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 2440][中山市选2011]完全平方数(容斥原理/莫比乌斯函数+二分)
阅读量:5848 次
发布时间:2019-06-19

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

Description

小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些

数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而
这丝毫不影响他对其他数的热爱。
这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一
个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了
小X。小X很开心地收下了。
然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗?

Solution

二分答案,于是问题转化成了如何求出不含完全平方数因子的数

【不知道为什么,这道题里1居然不是一个完全平方数,但如果是的话就没法做了】

容斥原理:x以内有多少个不含完全平方数因子的数=0个质数的乘积的平方的倍数个数(1)-1个质数乘积的平方的倍数个数(2*2=4、3*3=9...)+2个质数乘积的平方的倍数个数(2*2*3*3=36...)-...

于是就可以用上莫比乌斯函数了,线性筛求mu

#include
#include
#include
#include
#include
#define MAXN 50000using namespace std;typedef long long LL;int t,k;int pri[MAXN],cnt=0,mu[MAXN];bool jud[MAXN];void getmu(){ mu[1]=1; for(int i=2;i<=MAXN;i++) { if(!jud[i])pri[++cnt]=i,mu[i]=-1; for(int j=1;pri[j]*i<=MAXN&&j<=cnt;j++) { jud[i*pri[j]]=1; if(i%pri[j]==0){mu[i*pri[j]]=0;break;} mu[i*pri[j]]=-mu[i]; } }}LL check(LL x){ LL res=0; for(int i=1;i<=sqrt(x);i++) res+=x/(i*i)*mu[i]; return res;}int main(){ scanf("%d",&t);getmu(); for(int i=1;i<=t;i++) { scanf("%d",&k); LL ans,l=1,r=2000000000; while(l<=r) { int mid=(l+r)>>1; if(check(mid)>=k)ans=mid,r=mid-1; else l=mid+1; } printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/Zars19/p/6684098.html

你可能感兴趣的文章
python标准库00 学习准备
查看>>
4.2. PHP crypt()
查看>>
commonservice-config配置服务搭建
查看>>
连接池的意义及阿里Druid
查看>>
ComponentOne 2019V1火热来袭!全面支持 Visual Studio 2019——亮点之WinForm篇
查看>>
Python递归函数与匿名函数
查看>>
loadrunner安装运行一步一步来(多图)
查看>>
git请求报错 401
查看>>
监控工具htop的安装及使用
查看>>
Nodejs使用图灵机器人获取笑话
查看>>
Spring 任务调度 简单的,使用Schedule
查看>>
SQL 2005删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)的解决...
查看>>
【Touch&input 】支持多个游戏控制器(18)
查看>>
我的友情链接
查看>>
SQL语句学习
查看>>
What is Cluster Aware Updating in Windows Server 2012?
查看>>
进老男孩的自我介绍和决心书
查看>>
线上Linux服务器运维安全策略经验分享
查看>>
Android一些问题的解决方案
查看>>
ios之UIToolBar
查看>>