BZOJ2440: [中山市选2011]完全平方数dizh
2016-05-07 21:13
429 查看
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2440
中文题意很明确,要我们输入一个数k,求出第k个不是完全平方数的数。
解法就是求出1-x(一开始要设置一个大的上限 然后开始二分缩小区间直到找到答案)内的非完全平方数的个数,二分找到一个l=r时刚好非完全平方数的结果==k
需要的知识:二分法+容斥+莫比乌斯反演
AC代码如下:
[/code]
中文题意很明确,要我们输入一个数k,求出第k个不是完全平方数的数。
解法就是求出1-x(一开始要设置一个大的上限 然后开始二分缩小区间直到找到答案)内的非完全平方数的个数,二分找到一个l=r时刚好非完全平方数的结果==k
需要的知识:二分法+容斥+莫比乌斯反演
AC代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #define maxn 100005 typedef long long ll; using namespace std; int k; int mu[maxn]; int prime[maxn]; bool vis[maxn]; void getmu() { int tot=0; mu[1]=1; for(int i=2;i<=maxn;i++) { if(!vis[i]) { prime[++tot]=i; mu[i]=-1; } for(int j=1;prime[j]*i<=maxn;j++) { vis[prime[j]*i]=1; if(i%prime[j]==0) { mu[prime[j]*i]=0; break; } mu[prime[j]*i]=-mu[i]; } } } bool getans(ll x)//根据容斥+莫比乌斯奥特曼 { ll m=sqrt(x+0.5); ll ans=0; for(int i=1;i<=m;i++) { ans+=mu[i]*(x/(i*i)); } if(ans>=k)return true; return false; } int main() { int T; getmu(); scanf("%d",&T); while(T--) { scanf("%lld",&k); ll l=k,r=(ll)2e9; ll mid=(l+r)/2; ll ans=mid; while(l<r) { mid=(l+r)/2; if(getans(mid)) r=mid,ans=mid; else l=mid+1; } printf("%lld\n",ans); } }
[/code]
相关文章推荐
- RMQ算法
- Java开发中的23种设计模式详解
- MD之材料设计库(一)
- 双栈排序之程序员面试经典
- Linux课程实践一:Linux基础实践(基础操作)
- 【hihocoder 1257 Snake Carpet】构造
- 【字符串/尺取法】HDU5672String【BestCoder Round #81 (div.2)】
- android 中math常用方法
- 头文件搜索路径
- hdu 畅通工程系列题目
- Android - Retrofit 基础使用
- Java 基础面试题
- MyEclipse配置Maven
- 在IE9中实现placeholder功能
- [置顶] Unity中集成ShareSDK(3.X)的功能-Android平台
- c++第五次上机实验
- ThreadPoolExecutor详解
- 实战 ASP.NET Web API
- 优先队列和二叉堆
- 非线性的整数规划,大型软件仍不好用