zoukankan      html  css  js  c++  java
  • zoj 2286 Sum of Divisors

    // f(n)表示 n的约数和 不包括自己
    // 给你一个m 求1 到 100万里面 f(n)<=m 的个数
    // 那么首先要用筛选求出所有出 f(n)
    // 然后就好办了
    // 写好后 看见别人好快 去百度了下 发现有用二分的 用了下 快了 100Ms 不过 数据越大 二分优势越明显
    #include <iostream> #include <math.h> #include <map> #include <stack> #include <queue> #include <vector> #include <algorithm> #include <stdio.h> #include <string.h> using namespace std; #define maxm 10010 #define maxn 1000010 int prim[maxn/3],p; bool f[maxn]; int gcd(int a,int b){ int r; while(r=a%b){a=b;b=r;} return b; } bool isp(int n){ if(n==2) return true; if(n%2==0||n==1) return false; int m=(int)(sqrt(n+1.0)); for(int i=3;i<=m;i+=2) if(n%i==0) return false; return true; } int getprime(){ int i,j; f[1]=true; for(i=4;i<=maxn;i+=2) f[i]=true; int m=(int)(sqrt(maxn+1.0)); for(i=3;i<=m;i+=2){ for(j=i*i;j<=maxn;j+=i) f[j]=true; } for(i=1;i<=maxn;i++) if(!f[i]) prim[p++]=i; } int sum[maxn]; void sum_divisor(int n){ int i,j; int m=(int)(sqrt(n+1.0)); for(i=2;i<=n/2;i++) for(j=i+i;j<=n;j+=i) sum[j]+=i; } int main() { int n; int m; int i,k; sum_divisor(maxn); while(scanf("%d",&m)!=EOF){ n=0; for(i=1;i<=1000000;i++) if(sum[i]<m) n++; printf("%d ",n); } return 0; }

     二分 求解

    #include <iostream>
    #include <math.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    #define maxm 10010
    #define maxn 1000010
    int prim[maxn/3],p;
    bool f[maxn];
    int gcd(int a,int b){
        int r;
        while(r=a%b){a=b;b=r;}
        return b;
    }
    bool isp(int n){
         if(n==2) return true;
       if(n%2==0||n==1) return false;
       int m=(int)(sqrt(n+1.0));
       for(int i=3;i<=m;i+=2)
         if(n%i==0) return false;
       return true;
    }
    int getprime(){
        int i,j;
        f[1]=true;
        for(i=4;i<=maxn;i+=2)
            f[i]=true;
         int m=(int)(sqrt(maxn+1.0));
         for(i=3;i<=m;i+=2){
            for(j=i*i;j<=maxn;j+=i)
                f[j]=true;
         }
         for(i=1;i<=maxn;i++)
            if(!f[i]) prim[p++]=i;
    }
    int sum[maxn];
    void sum_divisor(int n){
       int i,j;
       int m=(int)(sqrt(n+1.0));
       for(i=2;i<=n/2;i++)
        for(j=i+i;j<=n;j+=i)
          sum[j]+=i;
    }
    int main()
    {
        int n;
        int m;
        int i,k;
        sum_divisor(maxn);
        sort(sum+1,sum+1000000+1);
        while(scanf("%d",&m)!=EOF){
           int l=1,r=1000000,mid;
           while(l<=r){
              mid=(l+r)>>1;
              if(sum[mid]+1>m) r=mid-1;
              else if(sum[mid]+1<=m) l=mid+1;
             // printf("%d ",sum[mid]+1); getchar();
           };
           printf("%d
    ",l-1);
        }
    
        return 0;
    }
  • 相关阅读:
    团队编程项目作业2-爬虫豆瓣top250项目代码设计规范
    《团队-爬取豆瓣电影TOP250-设计文档》
    个人编程作业1-GIT应用
    团队-爬取豆瓣Top250-开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170914-构建之法:现代软件工程-阅读笔记
    结对-贪吃蛇开发环境搭建过程
    结对-贪吃蛇游戏设计文档
    结对-结对编程项目作业名称-需求分析
    团队编程项目自我介绍
  • 原文地址:https://www.cnblogs.com/372465774y/p/3208878.html
Copyright © 2011-2022 走看看