Codeforces #720 div2 A~E题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces #720 div2 A~E题解相关的知识,希望对你有一定的参考价值。
视频讲解:BV1hK4y1A7dk
A. Nastia and nearly Good Numbers
题目大意
给定两个正整数
A
,
B
(
1
≤
A
,
B
≤
1
0
6
)
A,B(1 \\leq A,B \\leq 10^6)
A,B(1≤A,B≤106) ,找出三个不同的正整数
x
,
y
,
z
x,y,z
x,y,z ,
使得其满足以下两个条件:
- x , y , z x,y,z x,y,z中有且仅有一个数有一个能被 A ⋅ B A \\cdot B A⋅B 整除,另外两个数能被 A A A 整除;
- x + y = z x+y=z x+y=z
若能找到,则输出"YES"和任意解,若找不到,则输出"NO"。
题解
首先需要知道,若 A ⋅ B ∣ x A \\cdot B| x A⋅B∣x ,则 y ≡ z ( m o d A ⋅ B ) y \\equiv z (mod A \\cdot B) y≡z(modA⋅B) 。
因此我们只需找出一个 A ⋅ B A \\cdot B A⋅B 的倍数作为 x x x,再找另一个是 A A A 的倍数但不是 A ⋅ B A \\cdot B A⋅B 的倍数的数作为 y y y ,那么 z z z 必然符合条件。
不妨设
x
=
A
⋅
B
x=A \\cdot B
x=A⋅B,对于
y
y
y 来说:
当
B
=
1
B=1
B=1 时,不存在
A
∣
y
A | y
A∣y 且
A
⋅
B
∤
y
A \\cdot B \\nmid y
A⋅B∤y ,无解;
当
B
≠
1
B \\neq 1
B=1 时,设
y
=
A
y=A
y=A,
z
=
A
⋅
B
+
A
z=A \\cdot B +A
z=A⋅B+A 即可满足条件;
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long T,a,b;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&a,&b);
if(b==1)
printf("NO\\n");
else
{
printf("YES\\n");
printf("%lld %lld %lld\\n",a,a*b,a*b+a);
}
}
}
B. Nastia and a Good Array
题目大意
定义若数组 a a a 满足以下条件,则称其为“好数组”:
- 对于任意 i ( 2 ≤ i ≤ n ) i(2 \\leq i \\leq n) i(2≤i≤n) , g c d ( a i − 1 , a i ) = 1 gcd(a_{i-1},a_i)=1 gcd(ai−1,ai)=1
给定一个长度为 n ( 1 ≤ n ≤ 1 0 5 ) n(1 \\leq n \\leq 10^5) n(1≤n≤105) 的数组 a ( 1 ≤ a i ≤ 1 0 9 ) a(1 \\leq a_i \\leq 10^9) a(1≤ai≤109),你可以通过以下操作修改数组,使得数组变为“好数组”:
- 选择两个不同的下标 i , j ( 1 ≤ i , j ≤ n , i ≠ j ) i,j(1 \\leq i,j \\leq n,i \\neq j) i,j(1≤i,j≤n,i=j) 和两个整数 x , y ( 1 ≤ x , y ≤ 2 ⋅ 1 0 9 ) x,y(1 \\leq x,y \\leq 2 \\cdot 10^9) x,y(1≤x,y≤2⋅109),且满足 m i n ( a i , a j ) = m i n ( x , y ) min(a_i,a_j)=min(x,y) min(ai,aj)=min(x,y),使得 a i a_i ai 变为 x x x 且 a j a_j aj 变为 y y y 。
题解
首先先理解题意中的操作。该操作实际上是选择数组上的两个数,使得其中的较小值不变,较大值变为指定的数,并且这两个数可以选择是否交换位置。
再看题目的数据范围, a i a_i ai 最大为 1 0 9 10^9 109,但 x , y x,y x,y 最大可以有 2 ⋅ 1 0 9 2 \\cdot 10^9 2⋅109 ,而题目要求使得相邻两个数的 g c d = 1 gcd=1 gcd=1 。
因此不妨考虑将数组中的偶数位置变为一个在 ( 1 0 9 , 2 ⋅ 1 0 9 ) (10^9,2 \\cdot 10^9) (109,2⋅109) 范围内的素数,比如 1 0 9 + 7 10^9+7 109+7,奇数位变为 1 0 9 10^9 109 以下的数,这样必定满足 g c d ( a i − 1 , a i ) = 1 gcd(a_{i-1},a_i)=1 gcd(ai−1,ai)=1 。
具体实现而言,每次的操作为 i = p , j = p + 1 , x = m i n ( a p , a p + 1 ) , y = 1 0 9 + 7 i=p,j=p+1,x=min(a_p,a_{p+1}),y=10^9+7 i=p,j=p+1,x=min(ap,ap+1),y=109+7 ,其中 p p p 为小于 n n n 的奇数,即可满足条件。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
const int mx=1e9+7;
int a[MAXN];
int main()
{
int T,i,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("%d\\n",n/2);
for(i=1;i<n;i+=2)
printf("%d %d %d %d\\n",i,i+1,min(a[i],a[i+1]),mx);
}
以上是关于Codeforces #720 div2 A~E题解的主要内容,如果未能解决你的问题,请参考以下文章
codeforces round #324(div2) E题 Anton and lra
2019 GUDT WPTC 1 Div2 Problem E(题解) codeforces 115B