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
k−1个
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
a、b。求
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=最大的因子
×
×
×最小的因子
- 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
- 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为奇数,即一奇一偶时,两个数合并后值减一。其余情况值不发生改变。
- Masha需要尽快消除奇数,减少一奇一偶出现的次数,以保证结果尽可能大
- Olya需要将一个奇数与一个偶数配对,使其合并后的值减小,由于合并后的值必定为偶数,故一个奇数最多只会让结果减一,并且在Olya操作完后奇数个数减一。
- 故每三个奇数将导致结果减一,其中Masha将两个奇数合并,值不变;Olya将一个奇数与一个偶数合并,值减一。
由于Masha先行,所以保证Olya操作时必定存在至少一个偶数,不会发生只有奇数没有偶数的情况。 - 当所剩奇数不足三个时
- 当奇数只有1个时,无论是Masha还是Olya操作都必定导致结果减一。
- 当奇数只有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;
}
}