Codeforces Round #708 (Div. 2) C1,C2 k-LCM 数学构造

  • C 1 C1 C1链接, C 2 C2 C2链接
    在这里插入图片描述

  • 解题思路
    我们先看 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,(n1)/2,(n1)/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/21,那么我们发现 n / 2 − 1 + n / 2 − 1 + 2 = = n n/2-1+n/2-1+2==n n/21+n/21+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 k3 1 1 1,同时 n n n的值也要变成 n − ( k − 3 ) n-(k-3) n(k3),之后题目就和 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;
}

posted @ 2022-03-26 16:49  unique_pursuit  阅读(17)  评论(0)    收藏  举报