构造题
要求解题者通过观察问题的结构和规律,找到一种通用的方法或模式,使得在问题规模增大时,依然能够高效地得到答案。
在解决构造题时,以下几点思考是很重要的:
面对构造题的特点,通过以下方法更有效地解决这类问题
构造题目在算法竞赛中起着重要的作用,它们旨在考察选手对问题的抽象能力、发现规律的能力以及解决问题的创造性思维。以下是一些构造题目在算法竞赛中的常见应用场景:
这些是一些常见的构造题目应用场景。构造题目的特点是多样化,可以涵盖许多不同的领域和难度级别,有助于培养选手的创造性解决问题的能力。因此,在算法竞赛中,构造题目通常被认为是一种重要的题型。
蓝桥小蓝喜欢数学,他特别喜欢做数学题,有一天他遇到了一个有趣的数学题:
1
x
+
1
y
+
1
z
=
1
N
\frac{1}{x}+\frac{1}{y}+\frac{1}{z}=\frac{1}{N}
x1+y1+z1=N1
现在给定一个正整数N,小蓝想知道当x、y、z取何值时,上述等式成立。请你帮助小蓝找到满足条件的整数 x、y、z。
输入:
输入包含一个正整数N(1≤N≤1000)。
输出:
如果存在满足条件的整数x、y,z,则输出一个满足条件的解,以空格分隔。如果有多组解请输出任意一组即可。
如果不存在满足条件的解,则输出"No Solution"。
样例1:
输入:N=1
输出:2 3 6
样例2:
输入:N =2
输出:4 6 12
1
x
+
1
y
+
1
z
=
1
N
\frac{1}{x}+\frac{1}{y}+\frac{1}{z}=\frac{1}{N}
x1+y1+z1=N1
这个题如果数学题做的多的话,我们能够很快想到:
当N=2时,
1
/
2
=
1
/
4
+
1
/
4
,
1
/
4
=
3
/
12
=
1
/
12
+
2
/
12
=
1
/
12
+
1
/
6
1/2=1/4+1/4,1/4=3/12=1/12+2/12=1/12+1/6
1/2=1/4+1/4,1/4=3/12=1/12+2/12=1/12+1/6,所以
x
=
4
,
y
=
6
,
z
=
12
x=4 ,y=6, z=12
x=4,y=6,z=12
当N=3时,
1
/
3
=
1
/
6
+
1
/
6
,
1
/
6
=
3
/
18
=
1
/
18
+
2
/
18
=
1
/
18
+
1
/
9
1/3=1/6+1/6,1/6=3/18=1/18+2/18=1/18+1/9
1/3=1/6+1/6,1/6=3/18=1/18+2/18=1/18+1/9,所以
x
=
6
,
y
=
9
,
z
=
18
x=6, y=9 ,z=18
x=6,y=9,z=18
这里的答案就跟样例不同了,因为是构造体,案比较开放,题目的样例是随机出现,一般出题人可能会用一些比较偏的数据误导做题人。
当N=4时,
1
/
4
=
1
/
8
+
1
/
8
,
1
/
8
=
1
/
12
+
1
/
24
1/4=1/8+1/8,1/8=1/12+1/24
1/4=1/8+1/8,1/8=1/12+1/24,所以
x
=
8
,
y
=
12
,
z
=
24
x=8 ,y=12, z=24
x=8,y=12,z=24
显然我们可以推导得到,
当N=n时,
x
=
2
n
,
y
=
3
n
,
z
=
6
n
x=2n, y=3n,z=6n
x=2n,y=3n,z=6n为原式的一组解
这个题目可以归类于数学题目,我们需要构造出一组满足某个式子的解。
除此之外,有个关于1/n的推论1/n=1/(n+1)+1/(n*(n+1))
1
n
=
1
n
+
1
+
1
n
∗
(
n
+
1
)
\frac{1}{n}=\frac{1}{n+1}+\frac{1}{n*(n+1)}
n1=n+11+n∗(n+1)1
令n+1=t则
1
n
+
1
=
1
t
\frac{1}{n+1}=\frac{1}{t}
n+11=t1再带入
1
n
\frac{1}{n}
n1的公式得
1
t
=
1
t
+
1
+
1
t
∗
(
t
+
1
)
\frac{1}{t}=\frac{1}{t+1}+\frac{1}{t*(t+1)}
t1=t+11+t∗(t+1)1
t=n+1带回得,
1
n
+
1
=
1
n
+
2
+
1
(
n
+
1
)
∗
(
n
+
2
)
\frac{1}{n+1}=\frac{1}{n+2}+\frac{1}{(n+1)*(n+2)}
n+11=n+21+(n+1)∗(n+2)1
原式
1
n
=
1
n
+
1
+
1
(
n
)
∗
(
n
+
1
)
=
1
n
+
2
+
1
(
n
+
1
)
∗
(
n
+
2
)
+
1
n
∗
(
n
+
1
)
\frac{1}{n}=\frac{1}{n+1}+\frac{1}{(n)*(n+1)}=\frac{1}{n+2}+\frac{1}{(n+1)*(n+2)}+\frac{1}{n*(n+1)}
n1=n+11+(n)∗(n+1)1=n+21+(n+1)∗(n+2)1+n∗(n+1)1
当n=2时,
1
2
=
1
4
+
1
12
+
1
6
,
x
=
4
,
y
=
6
,
z
=
12
\frac{1}{2}=\frac{1}{4}+\frac{1}{12}+\frac{1}{6},x=4,y=6,z=12
21=41+121+61,x=4,y=6,z=12
当n=3时,
1
3
=
1
5
+
1
20
+
1
12
,
x
=
5
,
y
=
12
,
z
=
20
\frac{1}{3}=\frac{1}{5}+\frac{1}{20}+\frac{1}{12},x=5,y=12,z=20
31=51+201+121,x=5,y=12,z=20
给定一个正整数n。你的任务是找到任意三个整数a、b和c(0≤a,b,c≤10^9),使得(a㊉b)+(b㊉c)+(a㊉c)=n,或者确定不存在这样的整数。
这里,a㊉b表示a和b的按位异或运算。例如,2㊉4=6,3㊉1=2。
每个测试包含多个测试用例。
第一行包含一个整数t(1≤t≤10^4)–测试用例的数量。接下来的t行包含测试用例的描述
每个测试用例的唯一一行包含一个整数n(1≤n≤10^9)
对于每个测试用例,输出任意三个整数a、b和c(0≤a,b,c≤10^9),使得(a㊉b)+(b㊉c)+(a㊉c)=n。如果不存在这样的整数,则输出-1。
多组样例,每组样例一个n,问我们能不能找到三个数满足等式(a㊉b)+(b㊉c)+(a㊉c)=n,如果能找到就输出a,b,c,否则输出-1
首先,我们可以观察到以下性质:
奇数与奇数进行异或运算会得到一个偶数。
偶数与偶数进行异或运算会得到一个偶数。·
奇数与偶数进行异或运算会得到一个奇数。
因此,当a、b、c三个数全为奇数或者全为偶数时,得到的结果n一定是一个偶数。
当a、b、c中有两个为奇数时,我们可以假设a、b为奇数,那么n的结果为偶数+奇数+奇数=偶数。
同样地,当a、b、c中有两个为偶数时,我们可以假设a、b为偶数,那么n的结果为偶数+奇数+奇数=偶数。
综上所述,无论a、b、c取值如何,都无法得到一个奇数。
因此,当n为奇数时,一定无解。而当n为偶数时,我们可以取a=b=n>>1,c=0,这样就构成了一个满足题意的解
a[0] ~ a[n-1]a[1] ~ a[n]while (cin >> n){do thing}
while (scanf("%d", &n) != EOF){do thing}