uva 10791

来源:互联网 发布:java培训4个月靠谱吗 编辑:程序博客网 时间:2024/05/29 17:53


https://vjudge.net/problem/UVA-10791


题意: 给出一个n,是至少两个数的lcm,求这些数加起来的最小的和;


分析: 分解为素因子相乘的式子,因为lcm(a,b) = p1^max(a1,b1) * p2^max()……;

所以要使得这些数加起来最小,每个数分配一个因子就行

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const ll maxn = 1000000 + 10;#define INF 0x3f3f3f3fbool is_prime[maxn];ll prime[maxn];ll Init(){ll len = 0;memset(is_prime,true,sizeof(is_prime));for(ll i = 2; i < maxn; i ++){if(is_prime[i])for(ll j = i * 2; j < maxn; j += i)is_prime[j] = false;prime[len ++] = i;}return len;}ll data[maxn];ll num[maxn];ll work(ll n){memset(num,0,sizeof(num));ll len = 0;for(ll i = 0; prime[i] * prime[i] <= n; i ++){if(n % prime[i] == 0){data[len] = prime[i];while(n % prime[i] == 0){    num[len] ++;n /= prime[i];}//cout << data[len] << " " << num[len] << endl;len ++;}}if(n > 1){data[len] = n;num[len ++] = 1;}return len;}int main(){ll len = Init();ll Tcase = 1;ll n;while( ~ scanf("%I64d",&n) && n){cout << "Case "<< Tcase ++ <<": ";ll lens = work(n);ll ans = 0;for(ll i = 0; i < lens ; i ++){ans += pow(data[i],num[i]);}if(lens == 0){cout << 2 << endl;continue;}else if(lens == 1){cout << ans + 1 << endl;continue;}cout << ans << endl;}return 0;}


0 0
原创粉丝点击