zoukankan      html  css  js  c++  java
  • UVA10791 最小公倍数的最小和 Minimum Sum LCM

    [https://www.luogu.com.cn/problem/UVA10791]

    sol:
    设唯一分解式(n = p_1^{a_1}p_2^{a_2}...),那么(p_i^{a_i})作为一个单独的整数时最优。
    证明一下,对于一个合数x, 将它们拆成两个互质的数a和b,答案会更优,可以用作差法证明。其次,对于n,我们不能将单独的一个 $p_i^{a_i} $ 拆开, 因为要保证最小公倍数为n,所以
    拆出来的数中 (p_i) 的指数的最大值要为 (a_i).

    注意特判n=1与分解式中只有一个质数的情况。

    #include <iostream>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    typedef long long LL;
    
    const int N = 1500;
    int p[N], val[N], a[N], pos;
    
    void divide(LL n) {
       for(LL i = 2; i * i <= n; i ++) {
       	if( n % i == 0) {
       		int cnt = 0;
       		++ pos;
       		val[pos] = 1;
       		while(n % i == 0) {
       			n /= i;
       			cnt ++;
       			val[pos] *= i;
       		}
       		a[pos] = cnt;
       		p[pos] = i;
       	}
       }
       if(n > 1) {
       	p[++ pos] = n;
       	a[pos] = 1;
       	val[pos] = n;
       }
    /*	for(int i = 1; i <= pos; i ++) {
       	printf("%d^%d ", p[i], a[i]);
       }
       puts("");*/
    }
    
    int main() {
       LL n;
       int T = 0;
       while( scanf("%lld", &n) == 1 && n) {
       	pos = 0;
       	divide(n);
       	LL ans = 0;
       	if( n == 1) {
       		ans = 2;
       	}
       	else if( pos == 1) {
       		ans = (LL)(val[1] + 1ll);
       	}
       	else {
       		for(int i = 1; i <= pos; i ++) {
       			ans += val[i];
       		}
       	}
       	printf("Case %d: %lld
    ", ++T, ans);
       }
       return 0;
    } 
    
  • 相关阅读:
    csrf & xss
    android_sqlite
    android_error
    oracle笔记
    android_lesson_1
    mysql 设置编码
    前端进阶Event
    前端进阶Position
    chrome插件开发资料
    dom4j selectNodes
  • 原文地址:https://www.cnblogs.com/wyy0804/p/13616261.html
Copyright © 2011-2022 走看看