Uva10780 Again Prime? No Time.

本文详细解析了一道UVA在线编程挑战题目,介绍了如何通过质因数分解来解决该问题,并分享了作者在解决问题过程中遇到的疑惑及部分代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题搞了1个多小时= =!靠着UVA的BBS上的数据才过的 思路是:把m质因数分解,各质因数的系数用map(a)记录,把1到n的数都质因数分解,用map(b)记录(累加),然后逐一遍历,碰到a[i]=0则跳过,碰到b[i] = 0& a[i]!= 0 则无解,接下来就是我无法理解地方了,判断前两种情况之后,如果碰到b[i] 无法整除a[i] 的时候,理应是无解,但是我只要这样判 就是WA,如果不判,就是AC。。。希望大神能够赐教
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
const int maxp = 7000;
bool vis[maxn];
int prime[maxp];
int num;
void sieve(int n){
	int m = (int)sqrt(n+0.5);
	memset(vis,0,sizeof(vis));
	for(int i = 2; i <= m; i++) if(!vis[i]){
		for(int j = i*i; j <= n; j+= i) vis[j] = 1;
	}
}
int gen_prime(int n){
	sieve(n);
	int c = 0;
	for(int i = 2; i <= n; i++) if(!vis[i]){
	   prime[c++] = i;
	   //cout<<i<<"@@@"<<endl;
    }
	return c;
}
void factor(int n,map<int,int> &k){
	int tmp,i,now;
	tmp = (int)((double)sqrt(n)+1);
	now = n;
	for(i = 2; i <= tmp; i++)if(now %i==0){
		while(now%i==0){
			++k[i];
			now/=i;
		}
	}
	if(now != 1){
		k[now]++;
	}
}
int main(){
	
	int ncase,T=1;
	cin >> ncase;
	map<int,int> a,b;
	while(ncase--){
		int m,n;
		a.clear();
		b.clear();
		scanf("%d%d",&m,&n);
		//cout<<m<<" "<<n <<endl;
		num = gen_prime(m);
		factor(m,a);
		for(int i = 1; i <= n; i++){
			factor(i,b);
		}
		int ans = 100000000;
		bool flag = 0;
		for(int i = 0; i < num; i++){
			if(a[prime[i]] == 0){
				continue;
			}
			else if(b[prime[i]]==0){
				flag = 1;
				//cout<<"@@@"<<endl;
				break;
			}
			else{
				ans = min(ans,b[prime[i]]/a[prime[i]]);
			}
			//这一段完全搞不懂??!!! 
			/*else if(b[prime[i]]%a[prime[i]] == 0){
				ans = min(ans,b[prime[i]]/a[prime[i]]);
			}
			if(b[prime[i]]%a[prime[i]] != 0){
				flag = 1;
				cout<<b[prime[i]]<<" "<<a[prime[i]]<<" "<<prime[i]<<endl;
				cout<<"!!!!"<<endl;
				break;
		    }*/
		}
		if(flag){
			printf("Case %d:\nImpossible to divide\n",T++);
		    
		}else{
			printf("Case %d:\n%d\n",T++,ans);
		}
		
		
		
		//cout<<ans<<endl;
	}
	
	return 0;
}

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值