[HNOI 2001]求正整数
生活随笔
收集整理的這篇文章主要介紹了
[HNOI 2001]求正整数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
對于任意輸入的正整數n,請編程求出具有n個不同因子的最小正整數m。例如:n=4,則m=6,因為6有4個不同整數因子1,2,3,6;而且是最小的有4個因子的整數。
Input
n(1≤n≤50000)
Output
m
Sample Input
4Sample Output
6
題解
這道題和[HAOI 2007]反素數ant解題思路和方法簡直一毛一樣...
同樣我們引入這個公式:
對任一整數$a>1$,有$a={p_1}^{a_1}{p_2}^{a_2}…{p_n}^{a_n}$,其中$p_1<p_2<…<p_n$均為素數,而$a_1$,$a_2$…,$a_n$是正整數。
$a$的正約數個數為:$(1+a_1)(1+a_2)…(1+a_n)$
同理,我們也是求有$n$個因數的最小整數。
我們最壞的情況所有質數只取$1$個,由于$15<log_{2}50000<16$
所以只要取前$16$個質數即可,
其余都和之前那題一樣...
搜的時候為了保存最優值,因為數據大會爆$long$ $long$我們考慮用指數冪的形式保存,帶一個數組保存取質數的個數。
同時注意每層循環枚舉取質數的個數時候,因為不合法的情況很多,可以只枚舉$\sqrt n$次,然后用枚舉的值算出對應的另外一個值。
1 #include<set> 2 #include<map> 3 #include<cmath> 4 #include<ctime> 5 #include<queue> 6 #include<stack> 7 #include<cstdio> 8 #include<string> 9 #include<vector> 10 #include<cstdlib> 11 #include<cstring> 12 #include<iostream> 13 #include<algorithm> 14 using namespace std; 15 const double INF=1e100; 16 const int pri[18]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; 17 18 int n; 19 double lg[18],mm=INF; 20 int ans[18],tmp[18]; 21 22 void Dfs(double e,int y,int cen) 23 { 24 if (e>=mm) return; 25 if (y==1) 26 { 27 mm=e; 28 memcpy(ans,tmp,sizeof(ans)); 29 return; 30 } 31 if (cen>16) return; 32 for (int i=0;(i+1)*(i+1)<=y;i++) if (!(y%(i+1))) 33 { 34 if (i!=0) 35 { 36 tmp[cen]=i; 37 Dfs(e+lg[cen]*i,y/(i+1),cen+1); 38 tmp[cen]=0; 39 } 40 if ((i+1)*(i+1)!=y) 41 { 42 tmp[cen]=y/(i+1)-1; 43 Dfs(e+lg[cen]*(y/(i+1)-1),i+1,cen+1); 44 tmp[cen]=0; 45 } 46 } 47 } 48 void print() 49 { 50 const int MOD=1e4; 51 int a[100000],maxn=1; 52 a[1]=1; 53 for (int i=1;i<=16;i++) 54 { 55 for (int j=1;j<=ans[i];j++) 56 { 57 for (int k=1;k<=maxn;k++) a[k]*=pri[i]; 58 for (int k=1;k<=maxn;k++) a[k+1]+=a[k]/MOD,a[k]%=MOD; 59 if (a[maxn+1]) maxn++; 60 } 61 } 62 printf("%d",a[maxn]); 63 for (int i=maxn-1;i>=1;i--) printf("%04d",a[i]); 64 printf("\n"); 65 } 66 67 int main() 68 { 69 scanf("%d",&n); 70 for (int i=1;i<=16;i++) lg[i]=log(pri[i]); 71 Dfs(0,n,1); 72 print(); 73 return 0; 74 }?
轉載于:https://www.cnblogs.com/NaVi-Awson/p/7412291.html
總結
以上是生活随笔為你收集整理的[HNOI 2001]求正整数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: metasfresh 大型java开源制
- 下一篇: Java集合中removeIf的使用