2018年10月5日提高組模擬賽 T1 階乘
阿新 • • 發佈:2018-12-13
大意
有個正整數,設它們乘積為,你可以給乘上一個正整數,使剛好為正整數的階乘,求的最小值
思路
首先這道題資料很大,暴力肯定是不行的
因為樣例給的很狗血,所以我們手打一組資料一起理解
輸入
5
3 5 7 9 12
輸出
9
解釋
那麼我們怎麼去找到這個9呢? 首先 而資料看起來並沒有什麼聯絡,我們此時分解一下質因數 可以發現,對應的指數是一定不小於的,所以我們需要知道如果要讓指數不小於,最小需要是幾的階乘
程式碼
#include<cstdio>
using namespace std;int n,a,cx[100001],ans;
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)//分解質因數
{
scanf("%d",&a);
for(register int j=2;j*j<=a;j++)
while(a%j==0) cx[j]++,a/=j;
if(a!=1) cx[ a]++;
}
for(register int i=2;i<100001;i++)//找到所有的質數
{
int cnt=i;//初始化
while(cx[i]>0)//這是一個質因數,我們計算至少要幾的階乘它的指數是大於p的指數的
{
a=cnt;//例如我一開始是5,而p中5對應的指數是2,而5!的指數是1,不行,就找10!,其中5的指數是2就可以了,所i這次的答案是10
while(a%i==0) a/=i,cx[i]--;//計算它含有幾個對應的指數
cnt+=i;//考慮下一個倍數
}
if(cnt-i>ans) ans=cnt-i;//因為我們最後多加了一次,所以要減去
}
printf("%d",ans);//輸出
}