CodeforceC1,C2-k-LCM(思维)
Posted mb62d0ca5a0a625
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeforceC1,C2-k-LCM(思维)相关的知识,希望对你有一定的参考价值。
easy题目链接
hard题目链接
题意:
两个题意差不多给出你一个n和k,将n分成k份
- 使得 k个数和为n.
- 使得k个数的lcm小于等于n/2
easy版的k为3
hard版的k小于等n大于等于3
思路:
先说easy版,因为就是分成三个数,那么我们呢可以之间判断是否是偶数.
- 不是偶数,直接就是拿出一个1.剩下的平分.
- 是偶数,再去判断能否四等分,能的话我们分成1,1,2,这样两个条件都能满足,不能四等分,那么我们知道n是偶数而且部呢个四等分 那么n/2是奇数,所以我们先拿出一个2,剩下的平分,平分后的一定是偶数,即求lcm就是平分的数,不会超过n/2.
再看hard版,他从3份变成了k份,但是我们还是能找到相同性,就是拿出3份对n的部分进行符合条件的转化,就变成了easy版.通过1与任何数求lcm都是它本身我们可以想到我们可以先拿出(k-3)个1.那么我们就剩下3分,对(n-k+3)处理就转化成easy版了.
;
cin >> t;
while(t--)
///easy版
cin>>n>>m;
if(n%2)
cout<<1<<" "<<n/2<<" "<<n/2<<endl;
else
if(n%4)
cout<<2<<" "<<n/2-1<<" "<<n/2-1<<endl;
else
cout<<n/2<<" "<<n/4<<" "<<n/4<<endl;
/*
///hard版
cin>>n>>m;
n -= (m - 3);///独立除出来三个
///独立出来三个就剩下的平分,可以保证lcm小于等n/2
for(int i = 1; i <= m - 3; i++) cout << 1 << " ";/// 先把前面的整上1
///多一 直接半分就行
if(n % 2) cout << 1 << " " << n / 2 << " " << n / 2 << endl;
else///偶数
if(n % 4)/// 因为是偶数,不能整除4,那么n/2 一定是一个奇数
cout << 2 << " " << n / 2 - 1 << " " << n / 2 - 1 << endl;
else///能够整除那么可以分成4份
cout << n / 2 << " " << n / 4 << " " << n / 4 << endl;
*/
以上是关于CodeforceC1,C2-k-LCM(思维)的主要内容,如果未能解决你的问题,请参考以下文章