解题关键:由容斥原理得,num=1的倍数的数量−一个质数平方数(9,25,49...)的倍数的数量+两个质数的积平方数(36,100,225...)的数量−三个质数......

这道题用莫比乌斯的正向函数表达式理解较容易

此题让自己理解了只要与倍数相关即可用mobius。

此题还需要注意的一点,是平方数只需要反演质数。貌似是常识

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
ll t,n;
inline ll read(){
char k=;char ls;ls=getchar();for(;ls<''||ls>'';k=ls,ls=getchar());
ll x=;for(;ls>=''&&ls<='';ls=getchar())x=(x<<)+(x<<)+ls-'';
if(k=='-')x=-x;return x;
}
//莫比乌斯函数线性筛法
const int maxn=+;
bool vis[maxn];
int prime[maxn],mu[maxn];
void init_mu(int n){
int cnt=;
mu[]=;
for(int i=;i<n;i++){
if(!vis[i]){
prime[cnt++]=i;
mu[i]=-;
}
for(int j=;j<cnt&&i*prime[j]<n;j++){
vis[i*prime[j]]=;
if(i%prime[j]==) {mu[i*prime[j]]=;break;}
else { mu[i*prime[j]]=-mu[i];}
}
}
} bool check(ll x){
ll ans=;
for(ll i=;i*i<=x;i++){
ans+=mu[i]*(x/(i*i));
}
return ans>=n;
} ll erfen(ll l,ll r){
while(l<r){
ll mid=(l+r)>>;
if(check(mid)) r=mid;
else l=mid+;
}
return r;
}
int main(){
init_mu();
t=read();
while(t--){
n=read();
printf("%lld\n",erfen(, ));
} }

最新文章

  1. 【转载】兼容php5,php7的cURL文件上传示例
  2. 虚拟机安装Centos7 , 没有可用的网络设备【ifconfig 只有lo而没有eth0的解决办法】
  3. 根据多年经验整理的《互联网MySQL开发规范》
  4. VS中Debug和Realease、及静态库和动态库的区别整理
  5. Ruby on Rails Tutorial 第六章 用户模型
  6. Struts个人总结
  7. PyCharm 5.0.3 快捷键
  8. LEK-Introduction
  9. 格式化JSON字符串
  10. 03-TypeScript中的强类型
  11. java集合框架07——Map架构与源代码分析
  12. day92之支付宝支付
  13. HDU4288-STL模拟
  14. asp.net core模块学习
  15. mvc 模型验证及正则表达式
  16. SpringMVC 示例实战教程
  17. H5中JavaScript常用代码片段
  18. HDUOJ--畅通工程
  19. 【VIJOS】P1512 SuperBrother打鼹鼠
  20. 转:Andriod studio技巧合集

热门文章

  1. Android 事件分发机制 图解
  2. Python中的注解“@” 、Java 注解
  3. DockPanel的使用与技巧
  4. 小程序的生命周期 launchApp
  5. java基础语言 运算符
  6. ERR:/usr/local/lib/libcrypto.so.1.0.0: no version information available
  7. web 全栈 学习 2 一个好的页面是如何炼成的
  8. debian下编译openwrt固件
  9. 学习c语言的第14天
  10. Matlab之rand(), randn(), randi()函数的使用方法