UVA-10780 Again Prime? No Time. (數論-勒讓德定理-質因數分解)
阿新 • • 發佈:2019-01-12
題意
給一個m,給一個n,求m的最大次方數ans,能被n整除。
思路來源
https://blog.csdn.net/u011345136/article/details/38658977
題解
將m質因數分解m=,
對於每個質因子pi,其在n!中出現的次數為
sum=+…+,其中max是p的不超過n的最大冪,
顯然,pi的出現了1次,
pi²的出現了2次,在pi中被統計一次,在pi²被統計一次,不重不漏。
pi的更高次冪同上。
那麼需要的pi的ans值即為sum/ai。
該定理被稱作勒讓德定理。
短板效應,取ans最小即可。
誒,這題讓我學會怎麼用map的遍歷了
程式碼
#include <iostream> #include <cstdio> #include <cstring> #include <map> const int maxn=3e3+10; using namespace std; typedef long long ll; int t; map<ll,ll>q; map<ll,ll>fac(ll n) { map<ll,ll>res; for(ll i=2;i*i<=n;++i) { while(n%i==0) { ++res[i]; n/=i; } } if(n!=1)res[n]=1; return res; } int main() { scanf("%d",&t); for(int k=1;k<=t;++k) { ll n,m,cnt=0; ll ans=1e18; q.clear(); scanf("%lld%lld",&m,&n); q=fac(m); for(map<ll,ll>::iterator it=q.begin();it!=q.end();++it) { ll t=it->first,num=it->second,tmp=0; for(ll i=t;i<=n;i*=t)tmp+=n/i; tmp/=num; ans=min(ans,tmp); } printf("Case %d:\n",k); if(ans)printf("%lld\n",ans); else puts("Impossible to divide"); } return 0; }