【BZOJ 1053】[HAOI2007]反素數ant
阿新 • • 發佈:2018-03-11
pos clu stdin www. n) clas IT href 結束
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
用小的質數去湊那個數字。
顯然比用大質數去湊劃算。
因為
對於\(x = p1^{q1}*p2^{q2}*...*pn^{qn}\)
x的因子個數等於(q1+1)(q2+1)....(qn+1);
顯然 你用的質數越小。
這個指數就能更大一點。
(表示相同的數字的情況下。至少不會更差。
根據這個。
又有235....2329>2*10^9
則只要考慮這10個質數就可以了。
枚舉它們用了多少個。
(即枚舉各個質數的指數
(找出最優解就好。
【代碼】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1
using namespace std;
const double pi = acos(-1);
const int dx[4 ] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int a[11] = {1,2,3,5,7,11,13,17,19,23,29};
LL n;
LL ansnum=-1,ansyueshu;
void dfs(LL cur,LL idx,LL cnt,LL yueshu){
if (idx>10) return;
//超過範圍結束。
//cur大於n了,那麽結束
if (cur>n) return;
if (ansnum==-1){
ansnum = cur;
ansyueshu = yueshu;
}else {
if (yueshu>ansyueshu){
ansnum = cur;
ansyueshu = yueshu;
}else if (yueshu==ansyueshu){
if (cur<ansnum){
ansnum = cur;
ansyueshu = yueshu;
}
}
}
//還是選擇這個數字繼續乘。
dfs(cur*a[idx],idx,cnt+1,yueshu/(cnt+1)*(cnt+2));
//選擇下一個數字乘。
dfs(cur,idx+1,0,yueshu);
}
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
scanf("%lld",&n);
//當前數字,當前選擇的是第幾個數字,這個數字乘了幾次,約數個數
dfs(1,1,0,1);
printf("%lld\n",ansnum);
return 0;
}
【BZOJ 1053】[HAOI2007]反素數ant