洛谷 P1128 HNOI2001 求正整數

2021-07-24 11:24:45 字數 1469 閱讀 9889

題目描述

對於任意輸入的正整數n,請程式設計求出具有n個不同因子的最小正整數m。

例如:n=4,則m=6,因為6有4個不同整數因子1,2,3,6;而且是最小的有4個因子的整數。

輸入輸出格式

輸入格式:

n(1≤n≤50000)

輸出格式:

m輸入輸出樣例

輸入樣例#1:

int.in

4輸出樣例#1:

int.out

6【分析】

一道神題,昨天模擬賽的t2,然而昨天太浪了,就沒有做(譴責)。

我相信許多人和我一樣剛看了這道題一定會不知所措,接下來就分析一下。

題目中給了這個正整數的因數個數,並不好處理,如果是質因數就好處理多了。

介紹一下約數公式:n=πpri[i]*a[i](n是這個數的因數個數,pri是質數,a是指數)。

我就不證明了,我也不會。

資料範圍只有50000,計算可得約數個數最多16個,先打出一張素數表,以後的質數對答案沒有貢獻。

dfs(x,y,z)——x表示搜尋到的正整數,y表示x的因數個數,z表示已經搜尋到了第z個質數。

這樣是會超時的,考慮剪枝。

列舉當前質數的指數i時,y%(i+1)==0,那麼就是求y的因數,時間複雜度sqrt(y)。

當前質數的質數不可以為0,因為是從小到大搜尋,還是比較有用的。

又發現x是會爆long long的(比賽時用double卡的精度)如果搜尋時加高精度就太麻煩了,考慮用對數。

log(n)=σa[i]*log(pri[i])(自己推吧,字母代表的意義和上面一樣)。

搜尋時儲存指數,最後加乙個高精度就好了。

聽說還可以用dp,可我不會。

【**】

//min

#include

#include

#include

#include

#include

#include

#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

int n;

int ans[50005],get[18],tmp[18];

int pri[18]=;

double mn=dbl_max,lg[18];

inline

void mul()

}inline

void dfs(double x,int y,int z)

if(z>16) return;

for(i=0;(i+1)*(i+1)<=y;i++)

if(y%(i+1)==0)

}}int main()

洛谷P2001 硬幣的面值

其實這道題就按照題面意思直接模擬一下就好喇!很顯然如果給定硬幣的最小值大於1則輸出 no answer 因為這樣子就無法取到1這個面值了。先證明一下這一點 如果目前狀態可取前 x xx 且當前取了乙個面額為 a aa 的硬幣,要想構成前 x a x a x a 的所有 必須僅當 x a 1 x ge...

洛谷P2001硬幣的面值

題目傳送門 真是個毒瘤題 一開始想這是乙個多重揹包板子題,於是不假思索打了上去,樣例沒過,再一看題,原來不是 又眼瞎了 於是再次認真讀題 很顯然我們可以發現 如果給定硬幣最小面額大於1,那麼就一定輸出no answer!因為首先 為1的就組成不了。接著思考,假設第i種硬幣已用最小硬幣數ans組成最大...

洛谷 P3197 HNOI2008 越獄

來來來,日常水一篇 滑稽 監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入格式 輸入兩個整數m,n.1 m 10 8,1 n 10 12 輸出格式 可能越獄的狀態數,模1000...