bzoj1053(反素数)
4790: Lydsy1053 反素数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 7 Solved: 5
[Submit][Status][Web Board]
Description
对于任何正整数 x,其约数的个数记作g(x)。例如g(1)=1,g(6)=4。
如果某个正整数 x 满足:对于任意的 0<i<x,都有 g(x)>g(i),那么称 x 为反质数。例如整数 1,2,4,6 等都是反质数。
现在给定一个数 N(1≤N≤2*〖10〗^9 ),请求出不超过N的最大的反质数。
如果某个正整数 x 满足:对于任意的 0<i<x,都有 g(x)>g(i),那么称 x 为反质数。例如整数 1,2,4,6 等都是反质数。
现在给定一个数 N(1≤N≤2*〖10〗^9 ),请求出不超过N的最大的反质数。
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
HINT
Source
引理:1~n中最大的反素数,就是1~n中约数个数最多的数中最小的一个
1~n中的任意数x,的约数不可能超过十个
对于x属于1~n,若x为反素数,则将x质因数分解后次方单调递减
所以,直接爆搜
#include<cstdio> using namespace std; typedef long long ll; int s[100]; int ansnum,anssum; int n; int prime[20]={1,2,3,5,7,11,13,17,19,22,23,29,31}; void dfs(ll num,ll sum,int x){//num为约数个数,sum为现在总和,x为到第几个素数 if(x>12) return ; if(num>ansnum || (num==ansnum&&sum<anssum)){ ansnum=num; anssum=sum; //return ; } s[x]=0; while(sum*prime[x]<=n&&s[x]<s[x-1]){ s[x]++; //ll next=num*(s[x]+1); dfs(num*(s[x]+1),sum*=prime[x],x+1); } } int main(){ scanf("%d",&n); s[0]=10000; dfs(1,1,1); printf("%d\n",anssum); return 0; }