先按照题目意思暴力了一波,跟预想一样直接超时,只有30分。
#includeusing namespace std; int main() { int n,sum=0; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { if(i%j==0) { sum++; } } } cout< 然后看了一下题解,其实是运用数学规律来解答这题的,我们设F(n)是f(n)的前n项和,其核心公式是(若不能整除的,把小数去掉):
怎么来解释这个公式呢?
我们举个例子,假如n=6
通过上图可得:F(6)=14,那我们拿公式来看看结果是不是14:
通过检测,结果是一致的
当然这里关于去掉小数位的做法也很好理解,6要拆成1,那么6里面就有6个1,以此类推6里面可以拆出2个3,3个2,1个4,1个5,1个6,这些数分别对应了1-6里的每个数的约数。
然后就是写代码了:
#includeusing namespace std; int main() { int n,sum=0; cin>>n; for(int i=1;i<=n;i++) { sum+=n/i; } cout<


![[洛谷]P1403 [AHOI2005]约数研究 [洛谷]P1403 [AHOI2005]约数研究](http://www.mshxw.com/aiimages/31/867100.png)
