题解:P14304 【MX-J27-T1】分块
flying_bluecat · · 题解
题解:P14304 【MX-J27-T1】分块
闲话少说
本题数学题,还是比较简单的,放在 CSP-J 里大概 T1-2 的水平。
题意
题目让我们找到对于每一个不超过
那根据题面,很容易想到可以通过枚举小于
# include <bits/stdc++.h>
using namespace std;
int q;
long long check(long long x, long long n) {
long long l = x*x, r = min((x+1)*(x+1)-1, n), ans = 0;
for (long long i = l; i <= r; ++i) {
if (!(i % x)) {
ans++;
}
}
return ans;
}
int main() {
cin >> q;
while (q--) {
long long n, cnt=0;
cin >> n;
for (long long i = 1; i <= sqrt(n); ++i) {
long long ans = check(i, n);
cnt+=ans;
}
cout << cnt << endl;
}
return 0;
}
优化思路及数学证明
考虑数学思路优化。
以
不难证明,在所有
最后别忘了开 long long。
代码如下:
# include <bits/stdc++.h>
using namespace std;
int q;
int main() {
cin >> q;
while (q--) {
long long n, cnt=0;
cin >> n;
long long sq = (long long)(sqrt(n));
cnt += (sq*3);
for (long long i = sq+2; i >= sq; --i) {
if (i*sq > n) {
cnt--;
}
}
cout << cnt << endl;
}
return 0;
}