列表

详情


NC19967. [HAOI2007]反素数ANT

描述

对于任何正整数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

输出:

840

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 428K, 提交时间: 2022-08-03 17:02:02

#include<bits/stdc++.h>
typedef long long ll;
ll p[12]={2,3,5,7,11,13,17,19,23,29,31,37};
ll mx,ans,tot;
void dfs(ll k,int d,int w,int t){
    if(tot==t&&ans>k) ans=k;
    if(tot<t) tot=t,ans=k;
    if(d>11) return ;
    for(ll i=0,s=1;k*s<=mx&&i<=w;++i,s*=p[d])
        dfs(k*s,d+1,i,t*(i+1));
}
int main(){
    scanf("%lld",&mx);
    dfs(1,0,99,1);
    printf("%lld",ans);
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 408K, 提交时间: 2021-12-29 19:49:20

#include <bits/stdc++.h>
using namespace std;
int n,ans,maxx,pri[20]={0,2,3,5,7,11,13,17,19,23,29,31};
void dfs(int x,int y,long long z,int last){
    if(x>12){if(maxx<y||(maxx==y&&ans>z))maxx=y,ans=z;return;}
    for(int i=0;i<=last&&z<=n;i++,z*=pri[x])dfs(x+1,y*(i+1),z,i);
}
int main(){
	cin>>n;
    dfs(1,1,1,20);
    cout<<ans;
    return 0;
}

上一题