您的位置:首页 > 其它

zoj 2562 反素数

2013-08-07 22:36 423 查看
题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x))

x用质因数形式为:x=a1^p1*a2^p2......an^pn(ai为素数),那么一个数的因子个数f(x)=(p1+1)*(p2+1)*....*(pn+1)

反素数的性质有:x=a1^p1*a2^p2......an^pn,p1>=p2>=......>=pn

证明:若pi<pj(i<j),那么存在与它因子个数相等的x1且x1<x,与反素数的定义矛盾。

前十四个素数每个素数用一次的乘积已经大于10^16,所以枚举前十四个素数就可以了。

#include<iostream>
#include<cstdio>
using namespace std;

typedef long long LL;
int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
LL n,ans,Max;

void dfs(LL sum,LL num,LL k,LL t)
{
if(sum>Max) {Max=sum;ans=num;}
if(sum==Max && num<ans) ans=num;
if(k>14) return ;
LL temp=num;
for(int i=1;i<=t;i++)
{
if(temp*prime[k]>n) break;
temp*=prime[k];
dfs(sum*(i+1),temp,k+1,i);
}
}

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