计算 [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:  
原文地址:https://www.cnblogs.com/xiaochen/p/1911177.html