题解:P14304 【MX-J27-T1】分块
WangMouHongKe · · 题解
方法一:暴力
枚举
方法二:打表
预处理枚举
方法三:找规律
我们来看当
1 2 3 4 6 8 9 12 15 16 20 24 25 30
我们注意到每一个大于
当 n 是完全平方数时
答案就是
当 n 不是完全平方数时
我们考虑比
1 1 1 1 2 2 1 3 3 1 4 4 1 5
我们发现,对于一个完全平方数
。实际上,这个式子在当
Code
#include <iostream>
#include <cmath>
using namespace std;
int q;
long long n,s;
void sqr(){//用来修正sqrt()本身的误差,时间复杂度极小。
s = sqrt(n);
while (s * s > n) --s;
while ((s + 1) * (s + 1) <= n) ++s;
}
int main(){
// freopen("sqrt.in","r",stdin);
// freopen("sqrt.out","w",stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> q;
while (q--){
cin >> n;
sqr();
cout << 3 * s - 2 + (n - s * s) / s << '\n';
}
}
UPD
2025/10/19将数学公式做了小修改。