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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JZOJ 3775. 【NOIP2014模拟8.15】因子的排列

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 3775. 【NOIP2014模拟8.15】因子的排列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

一天,小B學習了分解質因數的相關內容。他發現,一個數的質因子可以有許多不同的排列方式,例如20=2*2*5=2*5*2=5*2*2,那么小B認為20的質因子有3種不同的排列方式。小B的同學現在有一個問題:如果一個整數的質因子的不同的排列方式的種類數為k,那么這個整數n(n>1)最小是多少?小B的同學一共有T個不同的k值,希望小B幫助這個同學解決問題。但是小B發現T太大了,并且給出的k值也相當大,因此小B向你求助。

Input

第一行,一個整數T。

接下來的T行,每行一個整數k。

Output

T行,每行一個整數,其中第i行的整數表示第i個k值對應的n的值。

Sample Input

4

1

2

3

105

Sample Output

2

6

12

720

Data Constraint

對于30%的數據,1< n<=100000;

對于全部的數據,1< n<2^63,1< k<2^63,1<=T<=1000。

Solution

  • 考慮

    x=p1a1×p2a2××pnan

  • 它的質因子排列方式一共有:

    (a1+a2++an)!a1!?a2!?...?an!

  • 因此可以得出最終回答的數的形式一定是這樣的:

    2a1×3a2×5a3×7a4×

  • 其中 a1a2a3a4

  • 我們可以搜索出所有符合這樣要求的數和對應的排列方案數,

  • 然后建一個map(C++)或者有序表,然后查詢。(范圍內符合條件的數一共19274個)。

  • 為避免各種問題,我開的是 long?doubleunsigned?long?long

  • 提示:質數最多為15個(從 2 到 47 為止)。

Code

#include<cstdio> #include<algorithm> #include<cctype> using namespace std; typedef unsigned long long ULL; typedef long double LDB; const int N=1e5+1; const ULL inf=(1ULL<<63)-1; struct data {ULL x,y; }f[N]; ULL f1[N],f2[N]; int tot,tot1,h[16]; bool bz[50]; template<typename T>inline T read() {T X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } void dfs(int x,int y,int z,LDB s1,LDB s2) {if(x>15) return;for(int i=1;i<=z;i++){s1*=(LDB)h[x];if(s1>inf) return;s2=s2*(LDB)(y+i)/i;if(s2>inf) return;f[++tot].x=s2;f[tot].y=s1;dfs(x+1,y+i,i,s1,s2);} } inline bool cmp(data x,data y) {return x.x<y.x || x.x==y.x && x.y<y.y; } int main() {for(int i=2;i<=47;i++){if(!bz[i]) h[++h[0]]=i;for(int j=1;j<=h[0] && i*h[j]<=47;j++){bz[i*h[j]]=true;if(i%h[j]==0) break;}}dfs(1,0,63,1,1);sort(f+1,f+1+tot,cmp);for(int i=1;i<=tot;i++)if(f[i].x!=f[i-1].x) f2[++tot1]=f[i].x,f1[tot1]=f[i].y;int T=read<int>();while(T--){ULL k=read<ULL>();int x=lower_bound(f2+1,f2+1+tot1,k)-f2;printf("%llu\n",f1[x]);}return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的JZOJ 3775. 【NOIP2014模拟8.15】因子的排列的全部內容,希望文章能夠幫你解決所遇到的問題。

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