计算 [1, X]区间内所有数字的因子个数之和and所有因子相加总和
http://acm.fzu.edu.cn/problem.php?pid=1988 MathHomeWork
题目:略;
分析:计算 [1, X]区间内所有数字的因子个数之和这个等价于X / 1 + X / 2 + ... + X / X,
这里注意是整除,直接暴力(O(X)超时),所以就要分段求;
例如:X/[i………j]==X[k](i<=k)<=j,没必要i……..j都求一次,(详情看代码1)
下面就要二分一下X,先暴力打表算出最大的X(55592640),然后对区间[1 ,55592640]
进行二分;(具体看代码2);
代码1:
1: int fun1(int x) {
2: int sum = 0;
3: for (int i = 1; i <= x;) {
4: int w = x / i;
5: int m = x / w;
6: //计算区间[i.......m]. 使X/k==w(i<=k<=m); 此题的关键点,当时就在这卡住了!
7: if (m == i) {
8: i++;
9: sum += w;
10: }
11: else {
12: sum += (m - i + 1) * w;
13: i = m + 1;
14: }
15: }
16: return sum;
17: }
代码2
1: void fun2(int x)
2: {
3: int left=1,right=55592640,mid;
4: while(left<=right)
5: {
6: mid=(left+right)>>1;
7: int sum=fun1(mid);
8: if(sum==x)
9: {
10: printf("%d\n",mid);
11: return ;
12: }
13: else if(sum>x)right=mid-1;
14: else left=mid+1;
15: }
16: printf("impossible!\n");
17: }
http://acm.hdu.edu.cn/showproblem.php?pid=2608 0 or 1
分析:计算1………x之间所有数的因子相加等价于(整除1的数有m1个,整除2的数有m2个……整除x的数有mx个)1*m1+2*m2+…………+x*mx;
注意一点:不要将一个数的同一个因子加多次!具体看代码!
1: /*
2: * File: main.cpp
3: * Author:小陈
4: * Created on 2010年12月2日, 下午9:11
5: */
6:
7: #include <cstdlib>
8: #include<iostream>
9: using namespace std;
10: int t, n;
11: long long sum;
12:
13: int main(int argc, char** argv)
14: {
15: scanf("%d", &t);
16: while (t--) {
17: sum=0;
18: scanf("%d", &n);
19: for (int i = 1; i*i<= n;i++)
20: {
21: int w=(n/i);
22: sum+=w*i;
23: sum+=(w-i)*(w+i+1)/2;
24: sum%=2;
25: }
26: printf("%d\n",sum);
27: }
28: return 0;
29: }
30: