Codeforces Round #708 (Div. 2) C1,C2 k-LCM 数学构造
-  解题思路 
 我们先看 C 1 C1 C1,解决了 C 1 C1 C1的话 C 2 C2 C2其实也就解决了。题目要求我们输出 k k k个数满足下列条件:- a 1 + a 2 + … + a k = n a_1+a_2+…+a_k=n a1+a2+…+ak=n
- L C M ( a 1 , a 2 , … , a k ) ≤ n 2 LCM(a_1,a_2,…,a_k)≤\frac{n}2 LCM(a1,a2,…,ak)≤2n
 由于C1中的 k k k只有 3 3 3,也就是说我们需要构建 3 3 3个数满足以上条件。我们知道偶数的因子为 2 2 2,而 1 1 1是任何数的因子,那么如果 n n n是奇数的话,那么其实就可以得到答案了,为 1 , ( n − 1 ) / 2 , ( n − 1 ) / 2 1,(n-1)/2,(n-1)/2 1,(n−1)/2,(n−1)/2,这样是最简单的。那么如果 n n n是偶数呢?我们还是利用上面那个性质,由于我们要分解 n n n,我们判断对 n n n对半分的奇偶性,这样如果 n m o d 4 = 0 n\mod4=0 nmod4=0,那么我们可以直接构造 n / 2 n / 4 n / 4 n/2\space n/4 \space n/4 n/2 n/4 n/4,这样保证了它们的最小公倍数是 n / 2 n/2 n/2,而如果是奇数呢?那也好办,我们将其变成偶数,即进行减 1 1 1操作,得到的是 n / 2 − 1 n/2-1 n/2−1,那么我们发现 n / 2 − 1 + n / 2 − 1 + 2 = = n n/2-1+n/2-1+2==n n/2−1+n/2−1+2==n,且最小公倍数也符合条件,这即是所有的构造方案,适用任何情况。那么对于 C 2 C2 C2呢?它的 k > = 3 k>=3 k>=3,那么我们何尝不把它变成 3 3 3再利用 C 1 C1 C1的方案解决了? 1 1 1是任何数的因子,利用这个特性,我们构造 k − 3 k-3 k−3个 1 1 1,同时 n n n的值也要变成 n − ( k − 3 ) n-(k-3) n−(k−3),之后题目就和 C 1 C1 C1一样了。 
-  C1代码 
/**
* @filename:C.cbp
* @Author : pursuit
* @Blog:unique_pursuit
* @email: 2825841950@qq.com
* @Date : 2021-03-18-08.47.26
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+5;
const int mod=1e9+7;
//数学构造类问题。
int t,n,k;
void solve(){
    //我们需要对n的奇偶性判断。
    if(n%2){
        //为奇数,我们只要输出1 (n-1)/2 (n-1)/2即可。
        cout<<1<<" "<<(n-1)/2<<" "<<(n-1)/2<<endl;
    }
    else{
        //为偶数的话,我们需要在n/2上做处理
        if(n%4==0){
            //如果n/4也是偶数,那么n/2 n/4 n/4则满足构造条件。
            cout<<n/2<<" "<<n/4<<" "<<n/4<<endl;
         }
         else{
            //如果不是偶数,那么我们就可以构造偶数,其我们易知偶数的因子有2.
            cout<<n/2-1<<" "<<n/2-1<<" "<<2<<endl;
         }
    }
}
int main(){
    while(cin>>t){
        while(t--){
            cin>>n>>k;
            solve();
        }
    }
    return 0;
}
- C2代码
/**
* @filename:C.cbp
* @Author : pursuit
* @Blog:unique_pursuit
* @email: 2825841950@qq.com
* @Date : 2021-03-18-08.47.26
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+5;
const int mod=1e9+7;
//数学构造类问题。
int t,n,k;
void solve(){
    //和处理C1一样,我们可以先输出k-3个1,这样问题就和C1一样了。
    for(int i=1;i<=k-3;i++){
        cout<<1<<" ";
    }
    n-=(k-3);
    //我们需要对n的奇偶性判断。
    if(n%2){
        //为奇数,我们只要输出1 (n-1)/2 (n-1)/2即可。
        cout<<1<<" "<<(n-1)/2<<" "<<(n-1)/2<<endl;
    }
    else{
        //为偶数的话,我们需要在n/2上做处理
        if(n%4==0){
            //如果n/4也是偶数,那么n/2 n/4 n/4则满足构造条件。
            cout<<n/2<<" "<<n/4<<" "<<n/4<<endl;
         }
         else{
            //如果不是偶数,那么我们就可以构造偶数,其我们易知偶数的因子有2.
            cout<<n/2-1<<" "<<n/2-1<<" "<<2<<endl;
         }
    }
}
int main(){
    while(cin>>t){
        while(t--){
            cin>>n>>k;
            solve();
        }
    }
    return 0;
}


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号