Codeforces Round #804 (Div. 2) A-E题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #804 (Div. 2) A-E题解相关的知识,希望对你有一定的参考价值。
视频讲解:BV1vN4y1M7cx
A. The Third Three Number Problem
题目大意
给定整数
n
(
1
≤
n
≤
1
0
9
)
n(1\\leq n \\leq 10^9)
n(1≤n≤109) ,求任意一组
a
,
b
,
c
(
0
≤
a
,
b
,
c
≤
1
0
9
)
a,b,c(0 \\leq a,b,c \\leq 10^9)
a,b,c(0≤a,b,c≤109) ,满足
(
a
⊕
b
)
+
(
b
⊕
c
)
+
(
a
⊕
c
)
=
n
(a \\oplus b)+(b \\oplus c)+(a \\oplus c)=n
(a⊕b)+(b⊕c)+(a⊕c)=n
无解输出 − 1 -1 −1 。
题解
仅考虑最低位的情况,会发现:
- 若三个数都为 00 00 00 或 01 01 01 ,则总和为 00 00 00 ;
- 若一个数为 01 01 01 ,另两个数为 00 00 00 ,则总和为 10 10 10 ;
- 若一个数为 00 00 00 ,另两个数为 01 01 01 ,则总和为 10 10 10 ;
因此对于任意一位,要不总和为 0 0 0 ,要不向更高位进一位。
因此若
n
n
n 为奇数,则无解。
有解时,一种合法的方案为
(
n
2
,
0
,
0
)
(\\fracn2,0,0)
(2n,0,0) 。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
int T,n;
scanf("%d",&T);
while(T--)
scanf("%d",&n);
if(n&1)
printf("-1\\n");
else
printf("%d %d %d\\n",n/2,0,0);
B. Almost Ternary Matrix
题目大意
给定两个偶数 n , m ( 2 ≤ n , m ≤ 50 ) n,m(2\\leq n,m \\leq 50) n,m(2≤n,m≤50) ,求 n × m n \\times m n×m 的01矩阵,满足对于矩阵内任意位置 ( i , j ) (i,j) (i,j) ,在四邻域上均有恰好2个与该元素不同的元素。
题解
用以下矩阵及其旋转90°的矩阵填充即可:
01
10
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=55;
int a[MAXN][MAXN];
int main()
int T,n,m,i,j;
scanf("%d",&T);
while(T--)
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for(i=0;i<n;i+=2)
for(j=0;j<m;j+=2)
if((i/2+j/2)%2)
a[i][j]=a[i+1][j+1]=1;
else
a[i+1][j]=a[i][j+1]=1;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
puts("");
C. The Third Problem
题目大意
给定长度为
n
n
n 的
1
1
1 到
n
−
1
n-1
n−1 的排列
a
a
a ,求有多少排列
b
b
b 与排列
a
a
a “相似”。
“相似”的定义为,对于任意区间
[
l
,
r
]
(
1
≤
l
≤
r
≤
n
)
[l,r](1 \\leq l \\leq r \\leq n)
[l,r](1≤l≤r≤n) ,均有
M
E
X
(
[
a
l
,
a
l
+
1
,
.
.
.
,
a
r
]
)
=
M
E
X
(
[
b
l
,
b
l
+
1
,
.
.
.
,
b
r
]
)
MEX([a_l,a_l+1,...,a_r])=MEX([b_l,b_l+1,...,b_r])
MEX([al,al+1,...,ar])=MEX([bl,bl+1,...,br])
题解
根据
M
E
X
MEX
MEX 的定义,我们需要从小到大逐个考虑每个数。
设
p
o
s
i
pos_i
posi 表示排列
a
a
a 中元素
i
i
i 出现的位置。
考虑用类似数学归纳法的思想,求解排列 b b b 的方案数。
初始区间 [ p o s 0 , p o s 0 ] [pos_0,pos_0] [pos0,pos0] 的 M E X MEX MEX 值必须为 1 1 1 ,因此 0 0 0 位置确定,方案数为 1 1 1 。
设当前区间为
[
l
,
r
]
[l,r]
[l,r] ,
0
0
0 到
i
−
1
i-1
i−1 的元素均在改区间中。
对于元素
i
i
i :
- 若 p o s i ∈ [ l , r ] pos_i\\in [l,r] posi∈[l,r] ,则在排列 b b b 中元素 i i i 也必须在 [ l , r ] [l,r] [l,r] 中,可选位置数为 r − l + 1 − i r-l+1-i r−l+1−i ,因此方案数 ∗ ( r − l + 1 − i ) *(r-l+1-i) ∗(r−l+1−i)。
- 若 p o s i ∉ [ l , r ] pos_i \\notin [l,r] posi∈/[l,r] ,则在排列 b b b 中元素 i i i 必须在 p o s i pos_i posi 位置上,方案数不变,并且 [ l , r ] [l,r] [l,r] 扩展至 [ m i n ( l , p o s i ) , m a x ( r , p o s i ) ] [min(l,pos_i),max(r,pos_i)] [min(l,posi),max(r,posi)] 。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int MAXN=100100;
int pos[MAXN];
int main()
int T,n,x,i,l,r;
ll ans;
scanfCodeforces Round #804 (Div. 2) A-E题解
Codeforces Round #804 (Div. 2) A-E题解
Codeforces Round #804 (Div. 2) A-E题解
Codeforces Round #436 E. Fire(背包dp+输出路径)