zoukankan      html  css  js  c++  java
  • 计算 [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:  
  • 相关阅读:
    转载:DIV+CSS有可能遇到的问题
    CSS3那些不为人知的高级属性
    php获取GET方式传入的全部变量名称与值:foreach用法
    转载:Erlang 资源
    Java工具类 Apache Commons:commons-lang
    PHP安装环境,服务器不支持curl_exec的解决办法
    2018年5月10日论文阅读
    C++ code:char pointers and char arrays(字符指针与字符数组)
    2018年5月9日论文阅读
    C++ code:More Loop Designs
  • 原文地址:https://www.cnblogs.com/xiaochen/p/1911177.html
Copyright © 2011-2022 走看看