UVA-10780 Again Prime? No Time. (数论-勒让德定理-质因数分解)

题意

给一个m,给一个n,求m的最大次方数ans,能被n!整除。

思路来源

https://blog.youkuaiyun.com/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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值