牛客 - 阶乘(唯一分解定理)
生活随笔
收集整理的這篇文章主要介紹了
牛客 - 阶乘(唯一分解定理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個 p ,求出最小的 n! 使得 p 可以整除 n!
題目分析:因為 p 高達 1e9 ,可以考慮sqrt(n)的算法,也就是唯一分解定理了,分解之后對于每個質因子,我們可以單獨討論,對于某個質因子 p[ i ] ,記錄其在 p 中的出現次數 num[ i ] ,我們現在只需要找到一個最小的 k ,使得 k! 內含有大于等于 num[ i ] 個 質因子p[ i ] 即可,然后用答案維護一下 k 的最大值就是答案了
這樣問題就轉換為了如何找到這個最小的 k ,這里提供兩種思路:
第一種思路就是直接二分,因為顯然此處的 k 具有單調性,我們的check函數也只需要找 [ 1 , k ] 內一共含有多少個 p[ i ] 就好了
第二種思路就是直接枚舉,因為如果都是基于 2 這個質因子,那么 num 最多也只有? 30 ,所以不難看出,所有質因子數量之和一定是小于 30 的,這樣我們就可以直接枚舉了,對于某個質因子 p[ i ] ,每次都加上 p[ i ] 然后計算答案就好了
代碼:這里給出第二種思路實現
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);int ans=-1;for(int i=2;i*i<=n;i++)if(n%i==0){int cnt=0;while(n%i==0){n/=i;cnt++;}int k=0;for(int j=i;;j+=i)//枚舉最小的 k {int num=j;while(num%i==0){num/=i;k++;}if(k>=cnt){ans=max(ans,j);break;}}}printf("%d\n",max(ans,n));}return 0; }?
總結
以上是生活随笔為你收集整理的牛客 - 阶乘(唯一分解定理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1326D2
- 下一篇: 牛客 - 树上求和(贪心+树形dp)