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(1A,B106) ,找出三个不同的正整数 x , y , z x,y,z x,y,z
使得其满足以下两个条件:

  1. x , y , z x,y,z x,y,z中有且仅有一个数有一个能被 A ⋅ B A \\cdot B AB 整除,另外两个数能被 A A A 整除;
  2. x + y = z x+y=z x+y=z

若能找到,则输出"YES"和任意解,若找不到,则输出"NO"。

题解

首先需要知道,若 A ⋅ B ∣ x A \\cdot B| x ABx ,则 y ≡ z ( m o d A ⋅ B ) y \\equiv z (mod A \\cdot B) yz(modAB)

因此我们只需找出一个 A ⋅ B A \\cdot B AB 的倍数作为 x x x,再找另一个是 A A A 的倍数但不是 A ⋅ B A \\cdot B AB 的倍数的数作为 y y y ,那么 z z z 必然符合条件。

不妨设 x = A ⋅ B x=A \\cdot B x=AB,对于 y y y 来说:
B = 1 B=1 B=1 时,不存在 A ∣ y A | y Ay A ⋅ B ∤ y A \\cdot B \\nmid y ABy ,无解;
B ≠ 1 B \\neq 1 B=1 时,设 y = A y=A y=A z = A ⋅ B + A z=A \\cdot B +A z=AB+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(2in) g c d ( a i − 1 , a i ) = 1 gcd(a_{i-1},a_i)=1 gcd(ai1,ai)=1

给定一个长度为 n ( 1 ≤ n ≤ 1 0 5 ) n(1 \\leq n \\leq 10^5) n(1n105) 的数组 a ( 1 ≤ a i ≤ 1 0 9 ) a(1 \\leq a_i \\leq 10^9) a(1ai109),你可以通过以下操作修改数组,使得数组变为“好数组”:

  • 选择两个不同的下标 i , j ( 1 ≤ i , j ≤ n , i ≠ j ) i,j(1 \\leq i,j \\leq n,i \\neq j) i,j(1i,jn,i=j) 和两个整数 x , y ( 1 ≤ x , y ≤ 2 ⋅ 1 0 9 ) x,y(1 \\leq x,y \\leq 2 \\cdot 10^9) x,y(1x,y2109),且满足 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 2109 ,而题目要求使得相邻两个数的 g c d = 1 gcd=1 gcd=1

因此不妨考虑将数组中的偶数位置变为一个在 ( 1 0 9 , 2 ⋅ 1 0 9 ) (10^9,2 \\cdot 10^9) (109,2109) 范围内的素数,比如 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(ai1,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

codeforces Round#332Div2 题解

[Codeforces] [1084] ??

2019 GUDT WPTC 1 Div2 Problem E(题解) codeforces 115B

codeforces round #499(div2) 做题记录

codeforces #271(div2) E