题意: 给定一个数 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} amax−amin。
数据范围: 5 ≤ x ≤ 1 0 9 5\leq x\leq 10^9 5≤x≤109
题解:
当 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=tx−1, 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,tx−1)=gcd(tx−1,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=tx−2,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,tx−2)=gcd(tx−2,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;
}