[中山市选2011]完全平方数[BZOJ2440]

欢迎大家访问我的老师的OJ———caioj.cn

题面描述

传送门

思路

很明显地,一个数不属于完全平方数或完全平方数的倍数,它的 μ \mu μ一定不等于0.

因此我们只要二分枚举 x x x

计算 [ 1 , x ] [1,x] [1,x]之中的非完全平方数

根据容斥原理: x x x以内非完全平凡数的个数为:

x x x- [ 1 , x ] [1,x] [1,x]中一个质数( 2 , 3 , 5 , . . . 2,3,5,... 2,3,5,...)的平方的倍数的数量+ [ 1 , x ] [1,x] [1,x]中两个质数之积( 6 , 10 , 14 , . . . 6,10,14,... 6,10,14,...)的平方的倍数的数量-…

所以我们可以枚举 ∀ i ∈ [ 1 , ⌊ x ⌋ \forall i\in[1,\left\lfloor\\ \sqrt{x}\right\rfloor i[1,x μ ( i ) \mu(i) μ(i)是否等于0,就说明它是否是一个完全平方数。若 = 0 =0 =0,则是。

a n s = ∑ i = 1 ⌊ x ⌋ μ ( i ) ∗ ⌊ x / ( i ∗ i ) ⌋ ans=\sum\limits_{i=1}^{\left\lfloor\\ \sqrt{x}\right\rfloor}\mu(i)*\left\lfloor\\ x/(i*i)\right\rfloor ans=i=1x μ(i)x/(ii)恰好就是非完全平方数的个数。

二分判断即可。

AC code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define ll long long
#define gc getchar()
using namespace std;
const int N=5e4+10;
const int M=3e4+10;
const int inf=5e4;
inline void qr(ll &x)
{
	x=0;int f=1;char c=gc;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
	while(c>='0'&&c<='9'){x=(x*10)+(c^48);c=gc;}
	x*=f;
}
int prime[M],m,mu[N];bool v[N];
inline void g_p()
{
	m=0;memset(v,false,sizeof(v));mu[1]=1;
	for(int i=2;i<=inf;i++)
	{
		if(!v[i])prime[++m]=i,mu[i]=-1;
		for(int j=1;j<=m&&i*prime[j]<=inf;j++)
		{
			v[i*prime[j]]=1;
			if(i%prime[j]==0){mu[i*prime[j]]=0;break;}
			mu[i*prime[j]]=-mu[i];
		}
	}
}
ll k;
ll calc(ll x)
{
	int t=sqrt(x);ll ans=0;
	for(ll i=1;i<=t;i++)
		ans+=mu[i]*(x/(i*i));//容斥 
	return ans;
}
int main()
{
	g_p();
	ll t;qr(t);
	while(t--)
	{
		qr(k);
		ll l=0,r=1644934081;
		while(l<r)
		{
			ll mid=(l+r)>>1;//配套 
			if(calc(mid)>=k)r=mid;
			else l=mid+1;
		}
		printf("%lld\n",l);
	}
	return 0;
}
引用:中山市是一个不设区的地级市,它包含了6个街道和18个镇。其中,有石岐街道、东区街道、西区街道、南区街道、五桂山街道、火炬开发区街道等。 引用:根据描述,这个游戏是一个给定了起始位置和目标位置的移动游戏。在一个n * m的棋盘上,棋盘上有两种不同的格子,分别用#和@表示。小明每次可以向上、下、左、右四个方向移动一格,如果移动到相同类型的格子上,费用为0,否则费用为1。问题要求计算从起始位置移动到目标位置所需的最小花费。输入包含多组数据,每组数据的格式为:第一行是两个整数n和m,表示棋盘的行数和列数;接下来的n行每行包含m个格子;最后一行是四个整数x1、y1、x2、y2,表示起始位置和目标位置的坐标。当输入的n和m都为0时,表示输入结束。输出每组数据的最小花费,每组数据独占一行。 引用:根据样例输入和输出,可以看出其中一个示例的输入是2行2列的棋盘,棋盘上有两种格子@@和@#;起始位置是(0, 1),目标位置是(1, 0)。根据游戏规则,需要计算从起始位置到目标位置的最小花费。输出为2。 根据以上信息,中山市和游戏之间没有直接关联。请问你是想了解中山市举情况吗?如果是的话,请提供更多的相关信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [不设区的地级市之中山市geoJSon可直接使用](https://download.csdn.net/download/weixin_36323996/12833075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【中山市2009】【BZOJ2464】小明的游戏](https://blog.csdn.net/CreationAugust/article/details/48679593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值