今天为大家再次带来一道数论题,我原本挺喜欢约数的种种奇妙性质的,做了这道题后我变的厌烦了好吧!
话不多说!我们正式开始!
(那你还说那么多话)
题目中的f(i)实际是
则可将化为:
至于求和旁边的对n/d向下取整的那玩意,用分块求解好一点。(相信你不想TLE的)
ACCODE
#include<bits/stdc++.h>
long long ans,n;
int main() {
scanf("%d",&n);
for (int i=1,j;i<=n;i=j+1) {
j=std::min(n,n/(n/i));
ans+=(long long)(j-i+1)*(n/i);
}
printf("%lld\n",ans);
}
你不会以为完了吧!
还有方法!
枚举1--n中因子有i的数的个数!重点在与一个数学公式: f(i)=n/i
至于公式的含义,看我解释:
1∼n 的因子个数,可以看成含有 2 这个因子的数的个数 + 含有 3 这个因子的数的个数 +....+ 含有n这个因子的数的个数。在 1∼n中含有“2”这个因子的数有n/2。3有n/3个。以此类推,公式就出来了
ACCODE
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
int main(){
scanf("%d",&n);
for(long long i=1;i<=n;++i){//枚举1--n中因子有i的数的个数
ans+=n/i;
}
printf("%d",ans);
}