1. 程式人生 > >UVA-10780 Again Prime? No Time. (數論-勒讓德定理-質因數分解)

UVA-10780 Again Prime? No Time. (數論-勒讓德定理-質因數分解)

題意

給一個m,給一個n,求m的最大次方數ans,能被n整除。

思路來源

https://blog.csdn.net/u011345136/article/details/38658977

題解

將m質因數分解m=\prod pi^{ai}

對於每個質因子pi,其在n!中出現的次數為

sum=\frac{n}{pi}+\frac{n}{pi^{2}}+…+\frac{n}{pi^{max}},其中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;
}