1. 程式人生 > >【BZOJ 1053】[HAOI2007]反素數ant

【BZOJ 1053】[HAOI2007]反素數ant

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