题意:
略
思路:
对于这个题我先想到的是找到给定的 n 的因子,相邻两个因子 i, j 之间的数,用n除以这个数得到的是 n/j 的到的数,事实上这样想是错的
但是也能提醒我们,某一段数,用n除完后,得到的结果是一样的;
建议读者手动把 24 所有的数 用24除完以后得到的数写出来会发现一个规律:
我们还是枚举 1~sqrt(n);
对于1 和 2:n/1 = 24, n/2 = 12 ——> 13 到 24 的除后的结果都是 1
对于2 和 3: n/2 = 12, n/3 = 8 ——> 9 到 12 的除后的结果都是 2
以此类推。。。。
还有一个问题,sprt(n)这里存在边界问题,会加多了, 可以根据题目的样例自己推一下
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7 + 7, maxd = 670000 + 7, mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;
int T;
ll n, m;
int main() {
scanf("%d", &T);
for(int tt = 1; tt <= T; ++tt) {
scanf("%lld", &n);
ll i, ans = 0;
m = sqrt(n);
for(i = 1; i <= m; ++i) {
ans += (n/i);
ans += i*(n/i - n/(i+1));
}
i--;
if(n/i == m) ans -= m;
printf("Case %d: %lld\n", tt, ans);
}
return 0;
}