luoguP4318完璧な正方形

背景:

古代を掛け。

トピックポータル:

https://www.luogu.org/problemnew/show/P4318

質問の意味:

完全な番号(1が完全な方形ではない)の提供は最初の追求、憎しみの数の二乗倍の正の整数であります n個 n個 数(要素のない正方形、すなわち、因子などの正方形のない数)が好き。

アイデア:

によると、 P インクルード P インクルード Q Q Q PoPoQQQ の兄 P P T PPT 、我々は2を発行することができます。
考えます [ 1 バツ ] [1、x]は 多数の因子の非正方形の数。
その後、問題が決意の問題となります。
私たちは、インクルージョン排除を考慮することができます。
以下のために バツ \ SQRT {X} 持っているすべての素数の中で バツ バツ 倍以内平方数
= = 0 0 平方の積(素数の数の数倍 1 1 的倍数)
- - 1 1 素数の数の二乗の倍数の数( 9 = 3 2 9 = 3 ^ 2 的倍数, 25 = 5 2 25 = 5 ^ 2 的倍数,…)
+ + 2 2 平方の積(素数の数の数倍 36 = 2 * 3 2 36 =(2 * 3)^ 2 的倍数, 100 = 2 * 5 2 100 =(2 * 5)^ 2 的倍数,…)

[ 1 バツ ] [1、x]は 2 I ^ 2 の合計の複数 x i 2 \ lfloorの\のFRAC {X} {I ^ 2} \ rfloor 、そして我々はそれが署名しました μ ( i ) \ムー(I) そこ a n s = i = 1 x μ ( i ) x i 2 ANS = \ sum_ {i = 1} ^ {\のSQRT {X}}ミュー(I)\ \ lfloor \ FRAC {X} {I ^ 2} \ rfloor

コード:

#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));
	}
}

おすすめ

転載: blog.csdn.net/zsyz_ZZY/article/details/89095413