⭐⭐⭐⭐⭐【质因子分解】整除问题——上交

题目描述

在这里插入图片描述

知识点

质因子分解

结果

在这里插入图片描述

实现

码前思考

  1. 由于这道题目出现在质因子分解的章节里面,所以我能想到要往质因子分解这条道上走,但是要是没有这个提示我可能很难想到!我可能还会想动态规划,哈哈哈哈哈。
  2. 首先,题中说N小于等于1000,那么如果直接暴力求解N!肯定会超出long long范围,所以我们要另辟蹊径,而最好的方法就是分解问题
  3. 我们都知道N! = N * (N-1) (N-2) * ... * 2。其次每个数都可以转换成质因子的乘积,所以我们在N!a之间找到了它们的公共部分——质因子
  4. 因此,我们只要比较N!的质因子是否包含 a k a^k ak的质因子就可以判断是否整除了。

代码实现

//直接暴力是不可以的,因为n!会特别大
//正是因为特别大,所以我们要另辟蹊径
//而最好的方法就是分解问题! 
//我们使用质因子分解,将n!分解成质因子的乘积
//然后把a也进行分解,这样就可以解题啦
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1010;

int prime[maxn];
int pNum = 0;
bool p[maxn]={0}; 

int n;
int a;

unordered_map<int,int> mpN;
unordered_map<int,int> mpA;

void Find_Prime(){
	for(int i=2;i<maxn;i++){
		if(p[i] == false){
			prime[pNum++] = i;
			for(int j=i+i;j<maxn;j=j+2){
				p[j] = true;
			}
		}
	}
}



int main(){
	//打表质数 
	Find_Prime();
	
	while(~(scanf("%d",&n))){
		scanf("%d",&a);
		//共享数据结构处理 
		mpN.clear();
		mpA.clear();
		
		//寻找n!的质因子,也就是n,n-1,n-2,...,2的质因子 
		for(int i=2;i<=n;i++){
			int num = i;
			
			int sqr = (int)sqrt(1.0*num)+1;
			for(int j=0;prime[j]<=sqr;j++){
				while(num % prime[j] == 0){
					mpN[prime[j]]++;
					num = num / prime[j];
				} 
			}
			if(num != 1){
				mpN[num]++;
			}	
		}
		
//		for(unordered_map<int,int>::iterator it=mpN.begin();it!=mpN.end();it++){
//				int p = it->first;
//				int cnt = it->second;
//				printf("%d %d\n",p,cnt);
//		}
		
		//寻找a的质因子
		int sqr = (int)sqrt(1.0*a)+1;
		for(int j=0;prime[j]<=sqr;j++){
			while(a % prime[j] == 0){
				mpA[prime[j]]++;
				a = a / prime[j];
			} 
		}
		if(a != 1){
			mpA[a]++;
		}
		
//		for(unordered_map<int,int>::iterator it=mpA.begin();it!=mpA.end();it++){
//			int p = it->first;
//			int cnt = it->second;
//			printf("%d %d\n",p,cnt);
//		}
		
		//接下来求k
		int flag = true;
		
		int k = 0;
		for(;flag == true;k++){
			for(unordered_map<int,int>::iterator it=mpA.begin();it!=mpA.end();it++){
				int p = it->first;
				int cnt = it->second;
				if(cnt*k > mpN[p]){
//					printf("%d\n",p);
//					printf("%d\n",cnt*k);
					flag = false;
					break;
				}
			}
		} 
		
		printf("%d\n",k-2);		
	}
	return 0;
} 

码后反思

  1. 这里使用unordered_map不用结构体存储质因子,会更加省心一些;
  2. 复习了一下unordered_map的一些基本操作~~
  3. 依然是质因子分解三步走战略!
  4. 《王道》上面的解法和我的不同。我感觉自己的这个时间复杂度更高一些。但是我不想看那个了,头痛!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值