【整体二分+莫比乌斯函数+容斥原理】BZOJ2440
2024-08-21 11:05:06
【题目大意】
求第k个不是完全平方数或完全平方数整数倍的数。
【思路】
由于μ(i)*(n/i^2)=n,可以直接从1开始,得出非完全平方数/完全平方数倍数的数的个数
注意一下二分的写法,这里用的是我一直比较喜欢的一种二分写法:
int lb=下界-1,ub=上界
while (ub-lb>1)
{
int mid=(lb+ub)>>1;
if (a[mid]>=k) ub=mid; else lb=mid;
}
ans=ub;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MAXN=+;
const ll INF=0x7fffffff;
int T;
ll k;
int miu[MAXN];
ll prime[MAXN];
int pnum=; void get_miu()
{
for (int i=;i<MAXN;i++) miu[i]=-INF;
miu[]=;
for (int i=;i<MAXN;i++)
{
if (miu[i]==-INF)
{
miu[i]=-;
prime[++pnum]=i;
}
for (int j=;j<=pnum;j++)
{
if (i*prime[j]>=MAXN) break;
if (i%prime[j]==) miu[i*prime[j]]=;
else miu[i*prime[j]]=-miu[i];
}
}
} ll square(ll x)
{
ll res=;
for (int i=;i*i<=x;i++) res+=miu[i]*(x/(i*i));
return res;
} ll get_ans()
{
ll lb=-,ub=MAXN*MAXN;
while (ub-lb>)
{
ll mid=(lb+ub)>>;
ll nowk=square(mid);
if (nowk>=k) ub=mid;
else lb=mid;
}
return ub;
} int main()
{
get_miu();
scanf("%d",&T);
for (int i=;i<T;i++)
{
scanf("%lld",&k);
printf("%lld\n",get_ans());
}
return ;
}
最新文章
- Web APi之认证(Authentication)两种实现方式后续【三】(十五)
- linux中给PHP安装mongodb的扩展
- 子句jion
- php js =>; splice 数组 插入 功能
- git_2-linux
- 关于 mobile sui a外链 老是出现加载失败的解决办法
- [转]使用Beaglebone Black的SPI
- POJ 1565 Skew Binary(简单的问题)
- Ali也开始玩了阿
- 数据意识崛起,从企业应用看BI软件的未来发展
- How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse
- IOS语音录取
- Spring事件解析
- java校验字符串是否为json格式
- T-SQL:qualify和window 使用(十七)
- js中的块级作用域
- I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
- JSP概述、API、注释
- plotly简单绘制柱状图
- oracle备份恢复
热门文章
- HDU 多校对抗赛 C Triangle Partition
- C++ 中 string, char*, int 类型的相互转换
- 如何把SSL公钥和私钥转化为PFX格式
- java 身份证15位转18位
- P3076 [USACO13FEB]出租车Taxi
- bzoj 4999: This Problem Is Too Simple!
- vue this.$router.push 页面不刷新
- 计算Linux权限掩码umask值
- python3,判断,循环练习1
- Make recursive