1. 程式人生 > >2018年10月5日提高組模擬賽 T1 階乘

2018年10月5日提高組模擬賽 T1 階乘

大意

nn個正整數a[i]a[i],設它們乘積為pp,你可以給pp乘上一個正整數qq,使p×qp\times q剛好為正整數mm的階乘,求mm的最小值

思路

首先這道題資料很大,暴力肯定是不行的 因為樣例給的很狗血,所以我們手打一組資料一起理解

輸入

5
3 5 7 9 12

輸出

9

解釋

9!/3×5×7×9×12=409!/(3\times 5\times 7\times 9\times 12)=40 那麼我們怎麼去找到這個9呢? 首先9!=1×2×3×4×5×6×7×8×99!=1\times 2\times 3\times 4\times 5\times 6\times 7\times 8\times 9

而資料p=3×5×7×9×12p=3\times 5\times 7\times 9\times 12看起來並沒有什麼聯絡,我們此時分解一下質因數 8!=27×32×51×718!=2^7\times 3^2\times 5^1\times 7^1 p=22×33×50×71p=2^2\times 3^3\times 5^0\times 7^1 9!=27×34×51×719!=2^7\times 3^4\times 5^1\times 7^1 可以發現,m
!m!
對應的指數是一定不小於pp的,所以我們需要知道如果要讓指數不小於pp,最小需要是幾的階乘

程式碼

#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);//輸出 }