2020CCPC绵阳 K- Knowledge is Power

   日期:2020-11-05     浏览:91    评论:0    
核心提示:题意:给你一个数字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

题意:给你一个数字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;
}

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服