您的位置:首页 > 其它

洛谷P1463 [SDOI2005]反素数ant

2017-07-17 08:41 274 查看
题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i),0<i<x则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?

输入输出格式

输入格式:

一个数N(1<=N<=2,000,000,000)。

输出格式:

不超过N的最大的反质数。

输入输出样例

输入样例#1:

1000

输出样例#1:

840

#include <iostream>
#define ll long long
using namespace std;
const int prime[14]={0,2,3,5,7,11,13,17,19,23,29,31,37};
ll n,s[110],ans,mx;
void dfs(int x,ll sum,ll mult)
{
if(x>12)//x>12时无论怎么取都比n的上界要大
return;
if(sum>mx||sum==mx&&mult<ans)
mx=sum,ans=mult;//根据反素数的定义,选择约数最多的或者是约数相同最大的值
s[x]=0;
while(mult*prime[x]<=n&&s[x]<s[x-1])
{//保证值小于或等于n,并且在对所求得值分解质因数后得到的b=a1^p1 ·a2^p2 ·a3^p3 ……an^pn;
//当中保证p1>=p2>=p3>=……>=pn 因为可以证明 在除p2和p3不同以外其他的pi均相同的情况下
//如果p3>p2那么所得的新数必然大于旧数,那么他就大于一个与他约数相等的数,所以新的数就不是反素数
s[x]++;//px++
mult*=prime[x];//所得的数
ll next=sum*(s[x]+1);//新的约数
dfs(x+1,next,mult);//继续用新的状态搜索
}
}
int main()
{
cin>>n;
s[0]=100000;
dfs(1,1,1);
cout<<ans;
return 0;
}
//这是一道搜索题...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: