UVa 10791 和最小的LCM (質因數分解)

2022-08-12 12:30:19 字數 1351 閱讀 7434

題意:

輸入正整數n(n<=2^31-1),找到至少兩個正整數,使得他們的lcm為n,並且和是最小。

分析:

這題昨天做的,wa的我一臉懵逼qaq,剛剛又看了下,原來我看成了是兩個整數,把至少這倆字漏看了qaq。

如果是至少兩個數的話,那麼就非常簡單了,只需要把質因數(次方)求和即可(因為可以是很多數的lcm)

此題需注意的情況:

(1)當n = 1時,應輸出2(1*1=1,sum=1+1=2);

(3)當只有單質因子時,sum=質因子相應次方+1;

(4)當n=2147483647時,它是乙個素數,此時輸出2147483648,但是它超過int範圍,應考慮用long long。

**:

typedef long long ll;

ll num[33];

int main()

tot=0;

for(ll i=2;i*i

<=n;i++)

tot++;}}

if(n>1)num[tot++]=n;

if(tot<2)

ll ans=0;

for(int i=0;iprintf("%lld\n",ans);

}return

0;}

把題目變一下:找到兩個正整數,使得他們的lcm為n,並且和是最小。

分析:

因為要求是兩個整數的lcm,所以要把分解得到的質因子(次方)分成兩組,兩組求積得到兩個數,使這兩個數的和最小。那怎麼分組呢?顯然讓兩組的積盡量的接近可以使所得和最小,那麼用優先佇列去維護一下分組就行。

typedef

long

long ll;

ll num[33];

int main()

tot=0;

priority_queuevector

,greater>q;

for(ll i=2;i*i<=n;i++)

tot++;}}

if(n>1)num[tot++]=n;

if(tot<2)

for(int i=0;iwhile(q.size()>2)

ll a1=q.top();q.pop();

ll a2=q.top();q.pop();

printf("%lld\n",a1+a2);

}return

0;}

UVA 10791 唯一分解定律 思維)

題目大意 輸入整數n,求至少兩個正整數,使得他們的最小公倍數為n,且這些整數的和最小,輸出最小的和。題意分析 求至少兩個正整數,使得他們的最小公倍數為n,我們使用到唯一分解定律。n p1 t1 p2 t2 pr tr 我們可以發現當因子個數最多時,這些因子相加和最小 比如 12 3 4 12 3 4...

uva11997 k個最小和

乙個k k的矩陣,每行選取乙個數相加則得到乙個和,求最小的前k個和。k 750 已知前m行最小的前k個和d 1 d k 則前m 1行最小的前k個和都必定是d i i k a m 1 x 排序,列舉x,用優先佇列處理。學會了個小技巧 node形式的優先佇列,想直接插入元素組成node struct n...

uva11997 k個最小和

乙個k k的矩陣,每行選取乙個數相加則得到乙個和,求最小的前k個和。k 750 已知前m行最小的前k個和d 1 d k 則前m 1行最小的前k個和都必定是d i i k a m 1 x 排序,列舉x,用優先佇列處理。學會了個小技巧 node形式的優先佇列,想直接插入元素組成node struct n...