先按照题目意思暴力了一波,跟预想一样直接超时,只有30分。
#include
using 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里的每个数的约数。
然后就是写代码了:
#include
using namespace std;
int main()
{
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
sum+=n/i;
}
cout<
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)