背景:
古代を掛け。
トピックポータル:
https://www.luogu.org/problemnew/show/P4318
質問の意味:
完全な番号(1が完全な方形ではない)の提供は最初の追求、憎しみの数の二乗倍の正の整数であります
数(要素のない正方形、すなわち、因子などの正方形のない数)が好き。
アイデア:
によると、
の兄
、我々は2を発行することができます。
考えます
多数の因子の非正方形の数。
その後、問題が決意の問題となります。
私たちは、インクルージョン排除を考慮することができます。
以下のために
持っているすべての素数の中で
倍以内平方数
平方の積(素数の数の数倍
的倍数)
各
素数の数の二乗の倍数の数(
的倍数,
的倍数,…)
各
平方の積(素数の数の数倍
的倍数,
的倍数,…)
…
の
の合計の複数
、そして我々はそれが署名しました
。そこ
コード:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int mu[1000010],prime[1000010];
bool bz[1000010];
int n,t=0;
void init(int ma)
{
mu[1]=1;
bz[0]=bz[1]=true;
for(int i=2;i<=ma;i++)
{
if(!bz[i]) prime[++t]=i,mu[i]=-1;
for(int j=1;j<=t&&i*prime[j]<=ma;j++)
{
bz[i*prime[j]]=true;
if(!(i%prime[j]))
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
bool check(int x)
{
int tot=0;
for(int i=1;i*i<=x;i++)
tot+=mu[i]*(x/(i*i));
return tot>=n;
}
int work(int x)
{
int ans,l=1,r=int(2e9),mid;
while(l<=r)
{
mid=(int)(((LL)l+r)>>1);
if(check(mid)) r=mid-1,ans=mid; else l=mid+1;
}
return ans;
}
int main()
{
int T;
init(1000000);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",work(n));
}
}