Codeforces Round #554 (Div. 2)·
A. Neko Finds Grapes
A就是钥匙和锁上的数字的和为奇数就行。
odd+even=odd
odd+odd=even
even+even=even
所以只要保证奇数和偶数加就行,就是用奇数的锁去配对偶数的钥匙,偶数的锁去配对奇数的钥匙
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=1e5+10;
LL a[MAXN];
LL b[MAXN];
int main()
{
LL n,m;
LL ao=0,ae=0,bo=0,be=0;
LL sum=0;
scanf("%lld %lld",&n,&m);
for(LL i=0;i<n;i++){
scanf("%lld",&a[i]);
if(a[i]%2==0){
ae++;
}else{
ao++;
}
}
for(LL i=0;i<m;i++){
scanf("%lld",&b[i]);
if(b[i]%2==0){
be++;
}else{
bo++;
}
}
sum=min(ae,bo)+min(ao,be);
printf("%lld",sum);
return 0;
}
B. Neko Performs Cat Furrier Transform
你需要知道:n^0=n,异或时,相同的那一位为0,不相同的那一位为1
题目要求最后要全部为2^m-1的形式,就是二进制的每一位都为1
以第一个样例
39的二进制是 100111,个人思路是先把前面的非0位异或为0,酱紫就不会受后面影响啦,所以当前的n就是为0的最大位数,当前为5;
39⊕(2^5-1)为 111000 为 56
偶数次操作时+1
111000 --> 111001 57
然后再选择n=3
57⊕(2^3-1)为 111110 为 62
62+1=63 111110–>111111 2^6-1
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n[40];
LL l[40];
int lenn(LL xx)
{
int flag=0;
int len=0;
while(xx){
int d=xx%2;
if(d){
if(flag) break;
len++;
}else{
flag=1;
len++;
}
xx=xx/2;
}
return len;
}
int main()
{
LL x;
LL t=1;
scanf("%lld",&x);
LL xx=x;
LL ans=0;
int fflag=1;
while(xx){
int d=xx%2;
if(d==0){
fflag=0;
}
xx=xx/2;
ans++;
}
if(fflag){
printf("0");
return 0;
}
ans=pow(2,ans)-1;
//cout<<ans<<endl;
for(int i=0;i<=30;i++){
n[i]=pow(2,i)-1;
}
LL llen=0;
while(t<=40){
if(t%2==0){
x++;
}else{
llen=lenn(x);
x=x^(n[llen]);
l[t]=llen;
}
if(x==ans){
printf("%d\n",t);
for(int i=1;i<=t;i++){
if(i%2==0) continue;
else{
printf("%d ",l[i]);
}
}
break;
}
t++;
}
return 0;
}
C. Neko does Maths
介个用语言不知道怎么描述,QAQ,所以直接上图吧(我不会说介道题我也没有理解透彻的)
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b) {return a/gcd(a,b)*b;}
int main()
{
ios::sync_with_stdio(false);
LL a,b;
LL x,k;
//scanf("%lld %lld",&a,&b);
cin>>a>>b;
if(a==b){
cout<<0;
//printf("0");
return 0;
}
x=abs(a-b);
LL ans=lcm(a,b);
LL ansk=0;
for(LL i=1;(i*i)<=x;i++){
if(x%i==0){
k=i-a%i;
LL lcmm=lcm(a+k,b+k);
if(lcmm<ans){
ans=lcmm;
ansk=k;
}
k=((x/i)-a%(x/i));
lcmm=lcm(a+k,b+k);
if(lcmm<ans){
ans=lcmm;
ansk=k;
}
}
}
//printf("%lld",ansk);
cout<<ansk;
return 0;
}
QAQ,C介道题比赛的时候完全没有介个思路啊。。。还是太菜了。。。有待提高啊。。。
向wjmzbmr学习,acm本就是逆天而行。
分类:
codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)