[BZOJ 1053] 反素数
Link:
Solution:
关键要看出几个性质:
1、虽然$2e9$很大,但最多也只能由前12个素数组成
2、对于每一个“反素数”,随着质因数的增大,系数必然减小
(否则可将两质因数交换,得到的值必然更小)
接下来直接$dfs$即可
Code:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,res=1,g=1; int pri[15]={0,2,3,5,7,11,13,17,19,23,29,31,37}; void dfs(int dep,ll cur,int cnt,int top) { if(dep==12) { if((cur>res&&cnt>g)||(cur<=res&&cnt>=g)) res=cur,g=cnt; return; } ll t=1; for(int i=0;i<=top;i++) { dfs(dep+1,cur*t,cnt*(i+1),i); t*=pri[dep];if(cur*t>n) return; } } int main() { scanf("%lld",&n); dfs(1,1,1,30); printf("%lld",res); return 0; }