讨论 / 不打表算法。需要因子初始化
囧TAT囧 2012-02-19 00:57:00
点我顶贴 收藏 删除
#include<stdio.h>//空间换时间

#include<stdlib.h>

#include<math.h>

int factor=0;

int DivideAndAdd1(int p);

int DivideAndAdd2(int p);

int main()

{

int begin,end,i,j;

int total=0;

int a[100001]={0};

scanf("%d%d",&begin,&end);

if(begin==0) begin=1;//防止把自己算进去

//因数预处理,优化算法,不打表

for(i=2;i<=end-begin;i++)//把小因子先过一遍

{

if(begin%i==0) j=0;

else j=i-begin%i;

for(;j<=end-begin;j+=i)

{

if(i<(j+begin)/i)

{

a[j]+=i;

a[j]+=((j+begin)/i);

}

else if(i==(j+begin)/i) a[j]+=i;

}

}

factor=end-begin;

if(factor==0) factor=1;

for(i=0;i<=end-begin;i++)//从小往大搜

{

a[i]++;//1是因子

a[i]+=DivideAndAdd1(begin+i);

if(a[i]<=begin+i) continue;

if(begin+i==DivideAndAdd2(a[i]))

{

total++;

// printf("%d\n",begin+i);

}

}

printf("%d",total);

system("pause");

return 0;

}

int DivideAndAdd1(int p)//分解并且加和

{

int t=(int)(sqrt(p)+0.3);

if(t*t==p&&p%2==1) return 0;

int total=0,i,j;

for(i=factor+1;i<=sqrt(p)+0.3;i++)

{

if(p%i==0)

{

total+=i;

if(i*i!=p)

total+=(p/i);

}

}

return total;

}

int DivideAndAdd2(int p)//分解并且加和

{

int t=(int)(sqrt(p)+0.3);

if(t*t==p&&p%2==1) return 0;

int total=1,i,j;

for(i=2;i<=sqrt(p)+0.3;i++)

{

if(p%i==0)

{

total+=i;

if(i*i!=p)

total+=(p/i);

}

}

return total;

}

查看更多回复
提交回复