约数研究

【题目描述】

统计每个正数N的约数个数,并用f(N)来表示。

例如12的约数有1、2、3、4、6、12,因此f(12)=6,下表给出了一些f(N)的取值:

f(N)表示N的约数个数,现在给定N,询问f(1)~f(N)的总和为多少。

【输入描述】

输入一个整数N。

【输出描述】

输出一个整数,表示答案。

【输入样例】

3

【输出样例】

5

【数据范围及提示】

对于20%的数据,N <= 5000;

对于100%的数据,N <= 1000000。

源代码:

#include<cstdio>
int n,Ans(0);
int main()
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
      Ans+=n/a;
    printf("%d",Ans);
    return 0;
}

/*
    很水的一道题,不过还挺考察变向思维的。
    从总体出发,考虑1~N中的每个数是多少数的约数,累加就可以了。
    一开始想到了昨天数论课上的公式:
        (1)唯一分解定理:
            N=(p1^k1)*(p2^k2)*...*(pn^kn);
        (2)约数个数函数:
            T(N)=(1+k1)*(1+k2)*...*(1+kn);
        (3)约数和函数:
            S(N)=(1+p1+p1^2+...+p1^k1)*(1+p2+p2^2...+p2^k2)*...*(1+pn+pn^2+...+pn^kn);
    数论真是博大精深。
*/
posted @ 2016-11-11 14:11  前前前世。  阅读(223)  评论(0编辑  收藏  举报