【UVa 10780】 Again Prime? No time.

【题目大意】

给定两个正整数N,M。求一个最大的正整数k,使得Mk|N!


【分析】

直接将N!和M的质因子分解,然后比较指数即可。

N!的质因子分解式:

    设N!=p1a× p2a× p3a3 ××× pkak

那么pi的指数 ai=sigma(N/(pij))  pij<=N


【代码】

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,b,a) for(int i=(b);i>=(a);--i)
#define pf printf
#define sf scanf
#define p_b push_back
#define INF (~0U>>1)
#define MAXN 20010

string error("Impossible to divide");
int N,M;
bool f[MAXN+10];
int zs[MAXN+10];
vector <int> Prime;

void Getprime(){
	int n=sqrt(MAXN);
	rep(i,2,MAXN){
		if(!f[i]){
			Prime.p_b(i);
			for(int j=i*i;j<=MAXN;j+=i)
			    f[j]=true;
		}
	}
}

int Getans(){
	int rt=INF;
	memset(zs,0,sizeof zs);
	int n=Prime.size();
	int m;
	rep(i,0,n-1){
		if(Prime[i]>N){
			m=i;
		    break;
	    }
		int acc=0,tmp=Prime[i];
		while(tmp<=N){
			acc+=N/tmp;
			tmp*=Prime[i];
		}
		zs[i]=acc;
	}
	rep(i,0,m-1){
		if(M%Prime[i]!=0) continue;
		int acc=0;
		while(M%Prime[i]==0){
			acc++;
			M/=Prime[i];
		}
		rt=min(rt,zs[i]/acc);
	}
	return M==1?rt:0;
}

int main(){
	int Kase;
	sf("%d",&Kase);
	Getprime();
	rep(i,1,Kase){
		pf("Case %d:\n",i);
		sf("%d%d",&M,&N);
		int ans=Getans();
		if(ans)
		    pf("%d\n",ans);
		else
		    cout<<error<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值