【唯一分解定理】antprime
题目描述
如果一个自然数n满足:所有小于它的自然数的约数个数都小于n的约数个数,则称n是一个Antiprime数。譬如:1、2、4、6、12、24都是Antiprime数。
输入
只有一个整数n(1≤n≤2 000 000 000)。
输出
只包含一个整数,即不大于n的最大Antiprime数。
样例输入
1000
样例输出
840
看图
#include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define ld long double using namespace std; ll n; ll mx,ant; int prime[12]={0,2,3,5,7,11,13,17,19,23,29,31}; void dfs(ll sum,ll cnt,ll maxn,ll q) { if(mx<cnt||(mx==cnt&&ant>sum)) { ant=sum; mx=cnt; } if(q==11) return; for(int i=1;i<=maxn;i++) { sum*=prime[q]; if(sum>n) return; dfs(sum,cnt*(i+1),maxn,q+1); } } int main() { cin>>n; dfs(1,1,100,1); cout<<ant<<endl; return 0; }