2020 ccpc绵阳 K

题意: 给定一个数 x x x,问将 x x x分解成至少两个数的大于 1 1 1的正数序列 a a a,其中对于任意 i ≠ j i\neq j i=j,都有 a i ≠ a j a_i\neq a_j ai=aj ( a i , a j ) = 1 (a_i,a_j)=1 (ai,aj)=1,求 a m a x − a m i n a_{max}-a_{min} amaxamin
数据范围: 5 ≤ x ≤ 1 0 9 5\leq x\leq 10^9 5x109

题解:

x x x是奇数,即 x = 2 k + 1 x=2k+1 x=2k+1,分解成 k k k k + 1 k+1 k+1即可,最小为 1 1 1
x x x是偶数,考虑 t x = x 2 tx=\frac{x}{2} tx=2x

  • t x tx tx为偶数,则分解成相邻的两个奇数 a 1 = t x − 1 a_1=tx-1 a1=tx1 a 2 = t x + 1 a_2=tx+1 a2=tx+1 g c d ( t x + 1 , t x − 1 ) = g c d ( t x − 1 , 2 ) = 1 gcd(tx+1,tx-1)=gcd(tx-1,2)=1 gcd(tx+1,tx1)=gcd(tx1,2)=1,最小为 2 2 2
  • t x tx tx为奇数,则分解成距离为 4 4 4的两个奇数 a 1 = t x − 2 , a 2 = t x + 2 a_1=tx-2,a_2=tx+2 a1=tx2,a2=tx+2 g c d ( t x + 2 , t x − 2 ) = g c d ( t x − 2 , 4 ) = 1 gcd(tx+2,tx-2)=gcd(tx-2,4)=1 gcd(tx+2,tx2)=gcd(tx2,4)=1,最小至多为 4 4 4
  • 考虑 t x tx tx为奇数时,最小是否可以为 2 2 2
    情况 1 1 1 a 1 = x , a 2 = x + 2 a_1=x,a_2=x+2 a1=x,a2=x+2
    情况 2 2 2 a 1 = x , a 2 = x + 1 , a 3 = x + 2 a_1=x,a_2=x+1,a_3=x+2 a1=x,a2=x+1,a3=x+2
  • 考虑 t x tx tx为奇数时,最小是否可以为 3 3 3
    情况 1 1 1 a 1 = x , a 2 = x + 1 , a 3 = x + 3 a_1=x,a_2=x+1,a_3=x+3 a1=x,a2=x+1,a3=x+3
    情况 2 2 2 a 1 = x , a 2 = x + 2 , a 3 = x + 3 a_1=x,a_2=x+2,a_3=x+3 a1=x,a2=x+2,a3=x+3
  • 特判下 6 6 6这个特殊情况:分解成 1 , 2 , 3 1,2,3 1,2,3,不符合每个数都大于 1 1 1

代码:

#include<bits/stdc++.h>
using namespace std;

int gcd(int a, int b) {
    
    
	return b == 0 ? a : gcd(b, a % b);
}

int main()
{
    
    
	int T; scanf("%d", &T);
	for(int c = 1; c <= T; ++c) {
    
    
		int x; scanf("%d", &x);
		int res = 1000;
		if(x & 1) res = 1;
		else if(x == 6) res = -1;
		else {
    
    
			int tx = x / 2;
			if(!(tx & 1)) res = 2;
			else {
    
    
				res = 4;
				if(x % 3 == 0) res = min(res, 2);
				
				int tmp = x - 4;
				if(tmp % 3 == 0 && (tmp / 3) % 2 == 0 && tmp / 3 > 1) {
    
    
					int a = tmp / 3, b = a + 1, c = a + 3;
					if(gcd(a, b) == 1 && gcd(a, c) == 1 && gcd(b, c) == 1) res = min(res, 3); 
				}
				
				--tmp;
				if(tmp % 3 == 0 && (tmp / 3) % 2 && tmp / 3 > 1){
    
    
					int a = tmp / 3, b = a + 2, c = a + 3;
					if(gcd(a, b) == 1 && gcd(a, c) == 1 && gcd(b, c) == 1) res = min(res, 3); 
				}
			}
		}
		printf("Case #%d: %d\n", c, res);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43900869/article/details/109460159