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;
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会c语言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值