题意
求
分析
分块
求 n/k = t 的k的个数
的个数为 个,于是 的个数就是
证明如下
又
于是
问题得证
参考代码
#include <iostream>//c++IO
#include <cmath>
#include <cstdio>
using namespace std;
int main(void)
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
int Kase = 0;
while(T--)
{
long long n;
cin>>n;
int m = (int)sqrt(n);
long long ans = 0;
for(long long i = 1;i < m; ++i)
{
ans += n/i;
ans += (long long )i*(n/i - n/(i+1));
}
ans += n/m;
ans += m*(n/m-m);//注意要加上等于n/k = m的情况,但如果k < m 这种情况已经计算过了
printf("Case %d: %lld\n",++Kase,ans);
}
return 0;
}
//......................................................
int main(void)
{
//std::ios::sync_with_stdio(false);
int T;
scanf("%d",&T);
int Kase = 0;
while(T--)
{
LL n;
scanf("%lld",&n);
LL ans = 0;
for(LL i = 1;i <= n; ){
ans += (n/(n/i)-i+1)*(n/i);
i = n/(n/i)+1;
}
printf("Case %d: %lld\n",++Kase,ans);
}
return 0;
}