2020CCPC绵阳 K- Knowledge is Power

题意:给你一个数字x,把x至少拆分为两个数的和,并且这些数字互质,问所有拆分方案中,在每个方案中最大值减去最小值的最小值是多少

思路
算是一个构造题吧。
①如果x是奇数,那么拆分为x/2和x-x/2,答案是1
②如果x是偶数并且x/2是偶数,,那么可以分成x/2+1,x/2-1这是分成了两个奇数,一定互质,答案是2
③如果x是偶数并且x/2是奇数,那么我们对x取余3进行判断。
如果是3的倍数,比如42,可以拆成13 14 15.那么答案是2
如果取模3后余1,比如70 可以分成22 23 25 答案是3
取模3余2,比如62 可以分成19 21 22 答案是3
按照上面构造方式 判断一下是不是两两互质即可
容易发现答案最多为4,因为如果x是偶数,x/2是奇数,那么只需要拆分为x/2-2、x/2+2即可
④注意特判x=6时候无解

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
signed main(){
    
    
    int T;scanf("%d",&T);int ca=0;
    while(T--){
    
    
        int ans=4;
        int x;cin>>x;
        if(x==6) ans=-1;
        else if(x&1) ans=1;
        else{
    
    
            int k=x/2;
            if(k%2==0) ans=2;
            else{
    
    
                ans=min(ans,x-k);
                if(x%3==0) ans=min(ans,2);
                else if(x%3==1){
    
    //70 22 23 25
                    int q=x/3,w=q+2,e=q-1;
                    if(__gcd(q,w)==1 && __gcd(q,e)==1 && __gcd(w,e)==1) ans=min(ans,3);

                }
                else {
    
    //62  19 21 22
                    int q=x/3-1,w=q+2,e=q+3;
                    if(__gcd(q,w)==1 && __gcd(q,e)==1 && __gcd(w,e)==1) ans=min(ans,3);
                }
            }
        }
        printf("Case #%d: %d\n",++ca,ans);

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43563669/article/details/109443700