题意:
res = res + n / i;
思路
https://yq.aliyun.com/articles/15323
当n/k == i 的时候, 符合该要求的k的个数就是 10/i - 10/(i+1)
代码
// https://yq.aliyun.com/articles/15323
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long LL;
int main () {
int T;
scanf ( "%d", &T );
for ( int k = 1; k <= T; ++k ) {
LL n;
scanf ( "%lld", &n );
int m = sqrt ( n );
LL ret = 0;
// i == (1, m)时,每个值n/i只出现一次
for ( int i = 1; i <= m; ++i )
ret += n / i;
// i > m时 ( j == n/i < m ),每个值n/i可能出现多次
// 次数等于n/(n/i) - n/(n/i+1)( 取整 )
for ( int j = 1; j <= m; ++j )
ret += ( n / j - n / ( j + 1 ) ) * j;
//除去m被加入两次的情况
if ( m == n / m )
ret -= m;
printf ( "Case %d: %lld\n", k, ret );
}
return 0;
}