日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)

發(fā)布時(shí)間:2024/2/28 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

勵(lì)志用盡量少的代碼做高效表達(dá)


題目(提交)鏈接——>UVA - 10791


題意

輸入正整數(shù)n,找至少兩個(gè)數(shù),使得他們的最小公倍數(shù)(Least Common Multiple)為n且要輸出最小的和。


心路歷程

最近在備考藍(lán)橋杯, 將本題納入分解質(zhì)因子專題。

接連刷了一下午的題, 腦瓜子嗡嗡的,看這道題時(shí)連題意都沒讀懂就稀里糊涂的開始敲了,WA,后又讀題,調(diào)試一小時(shí),成功AC。

首先假設(shè)我們知道了一系列數(shù)字a1,a2,a3……an,他們的LCM是n,那么什么時(shí)候他們是最優(yōu)解呢,當(dāng)他們兩兩互質(zhì)的時(shí)候

為了方便我們以兩個(gè)數(shù)來說明問題。

a和b的LCM是n,GCD是m,那么n=a/m*b , 它們的和就是sum=a+b;

如果m不為1(即a和b不互質(zhì)),那么我們?yōu)槭裁床粌?yōu)化一下,將a變?yōu)閍=a/m呢?,改變后a和b的LCM依然是n,但是他們的和顯然減少了

所以我們得到最重要的一個(gè)性質(zhì),要想a1,a2,a3……an的和最小,要保證他們兩兩互質(zhì),只要存在不互質(zhì)的兩個(gè)數(shù),就一定可以近一步優(yōu)化

那我們?cè)趺幢WC兩兩互質(zhì)呢?方法其實(shí)很簡(jiǎn)單,直接分解質(zhì)因子

例如24=222*3 , 只能分解為8和3,因?yàn)檫@里有3個(gè)2,這3個(gè)2必須在一起,如果分開了這3個(gè)2,這出現(xiàn)有兩個(gè)數(shù)會(huì)有一個(gè)公共的質(zhì)因子2,并且會(huì)使這兩個(gè)數(shù)的LCM不是24

再例如72=22233,只能分為8和9,因?yàn)?個(gè)2和2個(gè)3都不能分開,他們必須在一次

所以,我們將一個(gè)數(shù)n分解為質(zhì)因子后,順便做一個(gè)處理,在除干凈一個(gè)質(zhì)因子的同時(shí),將他們乘起來作為一個(gè)因子,處理完后會(huì)得到多個(gè)因子,他們之間同樣滿足兩兩互質(zhì)的性質(zhì)

然后是進(jìn)一步的分析

例如264600=82725*49 , 只是由3個(gè)2,3個(gè)3,2個(gè)5,2個(gè)7,處理后得到的因子,那么8,27,25,49的LCM是264600,并且兩兩互質(zhì),他們還要不要處理呢?不需要了,直接將他們加起來就是我們要的答案!為什么呢?可以將8,27,25,49這些數(shù)字乘起來,無論怎樣乘都好,最后得到的數(shù)字它們的LCM依然是n,但是乘起來再相加顯然比直接相加要大得多!

所以我們已經(jīng)得到了這個(gè)問題的解法

1.將一個(gè)數(shù)分解成質(zhì)因子,將相同的因子乘起來作為一個(gè)處理后的因子

2.將處理后得到的多個(gè)因子直接相加就是答案

3.因?yàn)轭}目說只要需要兩個(gè)數(shù)字,所以對(duì)于1和素?cái)?shù)我們需要小心。對(duì)于素?cái)?shù),我們只能分解出一個(gè)因子就它自己,對(duì)于1一個(gè)因子都分解不出來(我們不把1當(dāng)做因子),他們的答案都是n+1,因?yàn)橹挥?和n的LCM是n


注意:

1、當(dāng)n=2^31-1時(shí)為素?cái)?shù),輸出結(jié)果時(shí)需+1,而這個(gè)量級(jí)在int型變量會(huì)溢出,因此改為long long
2、由于本題涉及到本身為因子的情況,但從1遍歷到n顯然太臃腫,因此可以考慮從1遍歷到sqrt(n),最后對(duì)n做特殊判斷。


代碼展示

#include<bits/stdc++.h> using namespace std;int Prime_Factor(long long n) {long long sum=0; if(n==1) return 1;long long num = n/2; for(long long i = 2; i*i <= n; i++) {if(n%i==0) {long long sum1=1;while(n%i==0) {sum1 *= i; n /= i;}sum += sum1;}}if(n!=1) sum += n; //n等于1代表全除盡了 return sum; }int main() {int T=0;long long n; while(cin>>n && n) {printf("Case %d: %", ++T);long long sum = Prime_Factor(n);if(sum==n) sum += 1;cout << sum<< endl;} return 0; }

歡迎在評(píng)論區(qū)留言。 如果這篇文章對(duì)你產(chǎn)生了幫助,就請(qǐng)給博主一個(gè)贊吧!大家的點(diǎn)贊是我創(chuàng)作的最大動(dòng)力!

總結(jié)

以上是生活随笔為你收集整理的28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。