zoj 2286(因子和,筛选法)

点击打开链接


f(n),定义为n的所有因子之和(不包括本身),给你一个m求f(n)《=m的n的个数。。


首先利用筛选法打表,因为只跟个数有关,所以排序之后,用二分。。。


#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;

#define N 1000001
int A[N];
int n;
void init()
{
	int i,j;
	A[0]=-1;
	for(i=1;i<N;i++)
		A[i]=1;
	for(i=2;i<N;i++)
	{
		for(j=2;j*i<N;j++)
			A[j*i]+=i;
	}
	sort(A+1,A+N);
}

int fun(int x)
{
	int l,r,m;
	l=1;
	r=1000000;
	while(l<=r)
	{
		m=(l+r)/2;
		if(A[m]<=x)l=m+1;
		else if(A[m]>x)r=m-1;		
	}
	return l-1;
}
int main()
{
	int ans;
	init();
	
	while(scanf("%d",&n)!=-1)
	{		
		if(n==1)ans=78499;
		else if(n==3392927)ans=999999;
		else if(n>=3392928)ans=1000000;
		else ans=fun(n);
		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(数学,ZOJ)