Wannafly挑戰賽25 A 因子(n!中p的個數)
阿新 • • 發佈:2018-11-09
題意:連結:https://www.nowcoder.com/acm/contest/197/A
來源:牛客網
令 X = n!, 給定一大於1的正整數p 求一個k使得 p ^k | X 並且 p ^(k + 1) 不是X的因子。
思路:轉化成求X含多少p,p可以分解成2^a*3^b*……,就可以轉化成求X裡2的個數,2的個數……,比如樣例2的n=10000 p=12,那麼p=2^2*3,然後看n!有多少2和3,再“分配”給p,我們知道,n的階乘裡2的個數為 n/2+n/4+n/8+……,3的個數為n/3+n/9+……,然後p需要2個2,1個3,所以讓n!中2的個數除以2就是能組成p的2的個數,3也一樣,最後取p的因子裡面配的最少的個數,因為其他就算再多也需要這個最少的因子才能配成p。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int maxn=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);} ll qpow(ll a,ll b){ll t=1;while(b){if(b%2){t=(t*a)%mod;b--;}a=(a*a)%mod;b/=2;}return t;} int main() { std::ios::sync_with_stdio(false); ll n,p,ans=1e18; cin>>n>>p; for(int i=2;i<=p;i++) { ll sum=0,t=0,nn=n; while(p%i==0) { p/=i; t++; } while(nn) { nn/=i; sum+=nn; } if(t) ans=min(sum/t,ans); } cout<<ans<<endl; return 0; }