題目描述
對於任意輸入的正整數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...