反素数
题解:求一个1到n以内的数,使得这个数有最多的约数。如果有多解,只找最小的那个
因为要严格满足对于任意1<=i<=n,有g(x) > g(i),所以如果有g(i)=g(j)且i<=j,那么i是符合题意的,但是j是不符合的。因为g(j)>g(i)不满足
至于一个数的约数个数,把它分解质因数,假设是p1^q1 * p2^q2 * p3^q3……*pi^qi,那么约数个数是(q1+1)*(q2+1)*(q3+1)……*(qi+1)。
预处理出前10个质数直接暴搜就好了。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #include<map> #include<vector> #include<queue> #define ll long long #define INF 2e9 using namespace std; ll a[12]={0,2,3,5,7,11,13,17,19,23,29,31}; ll c[11]; ll ans=INF,n,k=1; void dfs(ll now, ll num, ll cnt) { if (now==11) { if (cnt>k || (cnt==k && ans>num)) { k=cnt; ans=num; } return; } ll num_cnt=num; for (int i=0;i<=c[now-1];i++) { if (num_cnt>n) return; c[now]=i; dfs(now+1,num_cnt,cnt*(i+1)); num_cnt*=a[now]; } } int main() { scanf("%lld",&n); c[0]=INF; dfs(1,1,1); printf("%lld\n",ans); }