日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HNOI 2001]求正整数

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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

4

Sample 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]求正整数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。