nssl1174-阶乘【!基础!数论】
生活随笔
收集整理的這篇文章主要介紹了
nssl1174-阶乘【!基础!数论】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
比賽時xjq說這道題很水,是個基礎(chǔ)數(shù)論。
然后…
就連交都沒交
正題
給出n個數(shù),求一個最小的mmm使得
m!∏i=1nai=q(q∈N+)\frac{m!}{\prod_{i=1}^na_i}=q(q\in N_+)∏i=1n?ai?m!?=q(q∈N+?)
解題思路
我們考慮因為要求在一起的乘積,所以個體是不會單獨被處理的,所以我們可以將a1~na_{1\sim n}a1~n?的乘積分解質(zhì)因數(shù),然后如果m!m!m!能夠?qū)⑺械倪@些質(zhì)因子都消掉就可以了。
然后我們考慮單獨的一個質(zhì)因子,比如:
a的乘積有2個5
我們發(fā)現(xiàn)5!5!5!只有1個5
但是10!10!10!有2個5,可以消掉,所以這個m至少要求是10。
這樣我們就可以得出算法,將a的乘積分解質(zhì)因數(shù),然后對于每個質(zhì)因子求一個最小的mmm,然后取這些要求中的最大值就好了。
code
#include<cstdio> #include<algorithm> #define N 100010 using namespace std; int n,a,p[N],m,ans; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a);for(int j=2;j*j<=a;j++)while(!(a%j))p[j]++,a/=j,ans++;if(a>1) p[a]++,ans++;}//分解乘積for(int i=2;i<=N-10;i++)if(p[i]){int cur=i;while(p[i]){int tmp=cur;while(p[i]&&!(tmp%i)) p[i]--,tmp/=i;cur+=i;}//求最小m的要求m=max(m,cur-i);//取最大要求}printf("%d",m); }總結(jié)
以上是生活随笔為你收集整理的nssl1174-阶乘【!基础!数论】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英睿达新款 T500 PCIe 4.0
- 下一篇: nssl1175-小S练跑步【bfs】