约数研究
【题目描述】
统计每个正数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); 数论真是博大精深。 */