问题描述
如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1, 2, 4, 6, 12, 24。
任务:
编一个程序:
计算不大于n的最大Antiprime数。
输入
输入只有一个整数,n(1 <= n <= 2 000 000 000)
输出
输入只有一个整数,n(1 <= n <= 2 000 000 000)
样例输入
1000
样例输出
840
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; #define pb push_back #define ll long long #define INF 0x3f3f3f3f #define N 2000000000 ll n; ll res; ll fac; ll prime[]={2,3,5,7,11,13,17,19,23,29}; void dfs(ll x,ll y,ll z,ll last) { if(x>=10){ if(z>fac) res=y,fac=z; if(z==fac && y<res) res=y,fac=z; return; } for(ll i=0;i<=last;i++){ if(y>n) break; dfs(x+1,y,z*(i+1),i); y*=prime[x]; } } int main() { while(scanf("%lld",&n)!=EOF) { res=fac=0; dfs(0,1,1,INF); cout<<res<<endl; } return 0; }