Codeforces Good Bye 2023

A. 2023

  • 构造

b b b数组乘积 x x x能被 2023 2023 2023整除则为 Y E S YES YES,否则 N O NO NO
由于乘积可能过大,考虑用 2023 2023 2023逐个除以b数组中的元素。
a a a数组为 1 1 1 2023 x \large \frac{2023}{x} x2023 k − 1 k-1 k1 1 1 1组成。

AC代码

#include<iostream>
#include<set>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
long long read(){
	long long x=0,w=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(isdigit(c)){
		x=(x<<1)+(x<<3)+(c&15);
		c=getchar();
	}
	return x*w;
}

int main(){
	int t=read();
	while(t--){
		int n=read(),k=read();
		int b[n];
		for(int i=0;i<n;++i)b[i]=read();
		bool flag=true;
		int base=2023;
		for(int i=0;i<n;++i){
			if(base%b[i]!=0){flag=false;break;}
			base/=b[i];
		}
		if(flag){
			cout<<"YES\n";
			for(int i=1;i<k;++i)cout<<"1 ";
			cout<<base<<endl;
		}
		else cout<<"NO\n";
	}
}

B. Two Divisors

  • 构造

声明:接下来讨论的因子不考虑 1 1 1 x x x本身。
x x x最大的两个因子 a 、 b a、b ab。求 a a a b b b的最大公约数 g = g c d ( a , b ) g=gcd(a,b) g=gcd(a,b),则 x x x最小的两个因子为 a g \large \frac{a}{g} ga b g \large \frac{b}{g} gb
x = x= x=最大的因子 × × ×最小的因子

  1. a g = 1 \large\frac{a}{g}\normalsize=1 ga=1,由于不考虑因子为 1 1 1的情况,所以最小因子为 b g \large \frac{b}{g} gb,故 x = b × b g x=b×\large \frac{b}{g} x=b×gb
  2. a g > 1 \large\frac{a}{g}\normalsize>1 ga>1,最小因子为 a g \large\frac{a}{g} ga,故 x = b × a g x=b×\large\frac{a}{g} x=b×ga

AC代码

#include<iostream>
#include<set>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
long long read(){
	long long x=0,w=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(isdigit(c)){
		x=(x<<1)+(x<<3)+(c&15);
		c=getchar();
	}
	return x*w;
}
long long gcd(long long a,long long b){
	return b?gcd(b,a%b):a;
}

int main(){
	int t=read();
	while(t--){
		long long a=read(),b=read();
		long long g=gcd(a,b),d=b/g,e=a*b/g;
		if(e==b)e*=d;
		cout<<e<<endl;
	}
}

C. Training Before the Olympiad

  • 博弈

Masha希望结果尽可能大,Olya希望结果尽可能小。Masha先行。
选择两个数 a i a_i ai a j a_j aj合并为 ⌊ a i + a j 2 ⌋ × 2 \lfloor\large\frac{a_i+a_j}{2}\rfloor\normalsize\times{2} 2ai+aj×2,当且仅当 a i + a j a_i+a_j ai+aj为奇数,即一奇一偶时,两个数合并后值减一。其余情况值不发生改变。

  1. Masha需要尽快消除奇数,减少一奇一偶出现的次数,以保证结果尽可能大
  2. Olya需要将一个奇数与一个偶数配对,使其合并后的值减小,由于合并后的值必定为偶数,故一个奇数最多只会让结果减一,并且在Olya操作完后奇数个数减一。
  3. 故每三个奇数将导致结果减一,其中Masha将两个奇数合并,值不变;Olya将一个奇数与一个偶数合并,值减一。
    由于Masha先行,所以保证Olya操作时必定存在至少一个偶数,不会发生只有奇数没有偶数的情况。
  4. 当所剩奇数不足三个时
    1. 当奇数只有1个时,无论是Masha还是Olya操作都必定导致结果减一。
    2. 当奇数只有0个或2个时,无论是Masha还是Olya操作都必定导致结果不变。

AC代码

#include<iostream>
#include<set>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
long long read(){
	long long x=0,w=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')w=-1;
		c=getchar();
	}
	while(isdigit(c)){
		x=(x<<1)+(x<<3)+(c&15);
		c=getchar();
	}
	return x*w;
}

int main(){
	int t=read();
	while(t--){
		int n=read();
		long long sum=0,a;
		int odd=0;
		for(int i=1;i<=n;++i){
			a=read();
			sum+=a;
			long long temp=sum;
			if(a&1)++odd;
			if(i!=1){
				temp-=odd/3;
				if(odd%3==1)temp-=1;
			}
			cout<<temp<<" ";
		}
		cout<<endl;
	}
}

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值