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