UVa 10791 Minimum Sum LCM(分解质因数)

假设输入N=p1^a1*p2^p2*....*pn^an,那么能得到它的数中对于质数pi至少有一个数含有因子pi^ai,对质因数pi,pj而言,满足这两个数有两种方法,要么这两个因子在一个数中,要么分别在两个数中。

显然在两个数中比在一个数中更优。因为可以证明当m,n都大于等于2时,m*n>=m+n。

因此最优的方案就是每个pi^ai单独当成一个数相加。


这样就变成了一个分解质因数的题。

这道题卡的有点紧。根号n时间分解质因数时,必须写成i+=2的形式,因为2以上偶数不可能是质数。开根号必须在循环外开,不能在for语句内部开。根据分解完N是不是等于1判断是不是存在一个大质数。


如果n只有一个质因子,结果要加1,因为至少两个数才有LCM。


代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#include <algorithm>
#define LL long long
int N;
int main(){
	int kase=1;
	while(~scanf("%d",&N)){
		if(!N) break;
		LL res=0;
		if(N==1){
			printf("Case %d: 2\n",kase++);
			continue;
		}
		int k=sqrt(N);
		int np=0;
		for(int i=2;i<=k;i+=2){
			if(N%i==0){
				int tmp=1;
				while(N%i==0){
					N/=i;
					tmp*=i;
				}
				res+=tmp;
				np++;
			}
			if(i==2) i--;
		}
		if(N>1){
			res+=N;
			np++;
		}
		if(np==1) res++;
		printf("Case %d: %lld\n",kase++,res);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值