题解:P14304 【MX-J27-T1】分块
P14304 【MX-J27-T1】分块 题解
题目大意
给定
思路
设
对于每个固定的
对于给定的
- 第一个满足条件的数是
k^2 (因为k \mid k^2 ) - 下一个满足条件的数是
k^2 + k - 再下一个是
k^2 + 2k ,依此类推
区间
因此,对于每个
- 如果
k^2 + 2k < (k+1)^2 ,则有3 个满足条件的数:k^2 ,k^2 + k ,k^2 + 2k - 如果
k^2 + 2k \geq (k+1)^2 ,则需要特殊处理
实际上,由于
因此总答案为:
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define str stringstream
#define PII pair<int,int>
const int N=1e5+5;
int t,n;
int solve(int n){
if(n==0)return 0;
int k=(int)sqrtl(n);// 计算 sqrtl(n) 的整数部分(一定要用 sqrtl() 不然会炸 90pts)
if(k==0)return 0;
// 公式:3*(k-1) + min((n-k^2)/k, 2) + 1
return 3*(k-1)+min((n-k*k)/k,2ll)+1;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
// freopen("sqrt5.in","r",stdin);
// freopen("sqrt5.out","w",stdout);
cin>>t;
while(t--){
cin>>n;
cout<<solve(n)<<"\n";
}
return 0;
}
感谢阅读。