zoj 2286 Sum of Divisors

时间:2023-03-09 19:35:48
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/],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==) return true;
if(n%==||n==) return false;
int m=(int)(sqrt(n+1.0));
for(int i=;i<=m;i+=)
if(n%i==) return false;
return true;
}
int getprime(){
int i,j;
f[]=true;
for(i=;i<=maxn;i+=)
f[i]=true;
int m=(int)(sqrt(maxn+1.0));
for(i=;i<=m;i+=){
for(j=i*i;j<=maxn;j+=i)
f[j]=true;
}
for(i=;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=;i<=n/;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=;
for(i=;i<=;i++)
if(sum[i]<m) n++;
printf("%d\n",n);
} return ;
}

二分 求解

#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/],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==) return true;
if(n%==||n==) return false;
int m=(int)(sqrt(n+1.0));
for(int i=;i<=m;i+=)
if(n%i==) return false;
return true;
}
int getprime(){
int i,j;
f[]=true;
for(i=;i<=maxn;i+=)
f[i]=true;
int m=(int)(sqrt(maxn+1.0));
for(i=;i<=m;i+=){
for(j=i*i;j<=maxn;j+=i)
f[j]=true;
}
for(i=;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=;i<=n/;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+,sum++);
while(scanf("%d",&m)!=EOF){
int l=,r=,mid;
while(l<=r){
mid=(l+r)>>;
if(sum[mid]+>m) r=mid-;
else if(sum[mid]+<=m) l=mid+;
// printf("%d ",sum[mid]+1); getchar();
};
printf("%d\n",l-);
} return ;
}