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