专栏文章

题解:P14304 【MX-J27-T1】分块

P14304题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@minian31
此快照首次捕获于
2025/12/02 02:52
3 个月前
此快照最后确认于
2025/12/02 02:52
3 个月前
查看原文
简单题。场切了。
考虑 n\sqrt n 下取整什么时候能被 nn 整除。
n\sqrt n 下取整为 kk,则 k2n<(k+1)2k^2 \le n < (k+1)^2,所以 k2n<k2+2k+1k^2 \le n < k^2+2k+1k2nk2+2kk^2 \le n \le k^2+2k,又 knk|n,所以 nk\dfrac{n}{k} 只有三个值 kkk+1k+1k+2k+2(因为 kk 是正整数,所以当 a>2a>2k2+ak>k2+2kk^2+ak>k^2+2ka<0a<0 时,k2+ak<k2k^2+ak<k^2)。
所以在 11k21k^2-1 中,有 3(k1)3(k-1) 个这样的正整数。k2k^2nn 中,只要特判就行了。
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int Q=100009;
int x[Q],q;
signed main(){
	ios::sync_with_stdio(0);
	cin>>q;
	for(int i=1;i<=q;i++) cin>>x[i];
	for(int i=1;i<=q;i++){
		int k=sqrt(x[i]);
		int ans=0;
		if(k==1){cout<<x[i]<<endl;continue;}
		ans+=3*(k-1);
		if(x[i]>=k*k) ans++;
		if(x[i]>=k*(k+1)) ans++;
		if(x[i]>=k*(k+2)) ans++;
		cout<<ans<<'\n';
	}
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...