您的位置:首页 > 其它

zoj 2562 More Divisors

2013-09-14 21:48 246 查看
//经典题,反素数

定义

对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

性质

性质一:一个反素数的质因子必然是从2开始连续的质数.
性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

搞不懂的是为什么typedef long long 会比 每个long long 快 ,之前一直超时。

  //num:当前枚举到的数,k:枚举到的第k大的质因子;sum:该数的约数个数;limit:质因子个数上限;

//l因为性质二 所以可以用limit优化

#include<cstdio>
typedef long long ll;
ll maxsum,bestnum,n;
const int prime[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
void dfs(ll num,ll sum, int k, int limit)
{

int i;
if(sum>maxsum)
{
bestnum=num;
maxsum=sum;
}
if(maxsum==sum&&num<bestnum)
{
bestnum=num;
}
if(k>15) return;
ll temp=num;
for( i=1; i<=limit; i++)
{
if(temp*prime[k]>n) break;
temp=temp*prime[k];
dfs(temp,sum*(i+1),k+1,i);

}
}

int main()
{

while(scanf("%lld",&n)!=EOF)
{
bestnum=1;
maxsum=0;
dfs(1,1,1,50);
printf("%lld\n",bestnum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zoj