首页 > 其他分享 >AT_abc347_d 的题解

AT_abc347_d 的题解

时间:2024-03-31 11:35:04浏览次数:21  
标签:ssy 题解 s1 pos 20010 abc347 s2 数位

(一)

数学题。

根据 \(C\) 的值,可以得出 \(x\) 和 \(y\) 有 \(s1+s\) 个相同的数位和 \(s2\) 个不同的数位。

\(s1\) 是 \(C\) 的二进制中 \(0\) 的数量,\(s2\) 是 \(C\) 的二进制中 \(1\) 的数量。

\(x\) 和 \(y\) 可以通过在开头放 \(s\) 个 \(1\) 的方式既不改变异或大小,又能凑到 \(a\) 和 \(b\)。

然后按 \(1\) 的个数列出方程,设 \(x\) 的相同数位中有 \(x'\) 个 \(0\),不同数位中有 \(y'\) 个 \(0\)。

\[s1+s-x'+s2-y'=a \]

\[s1+s-x'+y'=b \]

解这个不定方程即可。

注意要判断 \(x\) 和 \(y\) 是否 \(<2^{60}\)。

(二)

AC 代码。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c,pos[20010],n,s1,s2,s,X[20010],Y[20010],cc;
signed main(){
	cin>>a>>b>>c;
	cc=c;
	while(c>0){
		pos[++n]=c&1;
		c>>=1;
		s1+=pos[n]==0,s2+=pos[n]==1;
	}
	if((s2+b-a)%2==1){
		cout<<-1;
		return 0;
	}
	int y=(s2+b-a)/2,x;
	int p=2*s1+s2-b-a;
	if(abs(p)%2==1){
		cout<<-1;
		return 0;
	}
	if(p>0)s=0,x=p/2;
	else x=0,s=(-p)/2;
	if(n+s>60){
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(pos[i]==0){
			if(x)X[i]=0,x--;
			else X[i]=1;
			Y[i]=X[i];
		}
		else{
			if(y)X[i]=0,y--;
			else X[i]=1;
			Y[i]=X[i]^1;
		}
	}
	for(int i=1;i<=s;i++)n++,X[n]=Y[n]=1;
	int sx=0,sy=0;
	p=1;
	for(int i=1;i<=n;i++){
		sx+=X[i]*p,sy+=Y[i]*p;
		p*=2;
	}
	int ssx=sx,ssy=sy;
	while(ssx>0){
		a-=ssx&1;
		ssx>>=1;
	}
	while(ssy>0){
		b-=ssy&1;
		ssy>>=1;
	}
	if(n<=60&&a==0&&b==0&&(sx^sy)==cc)cout<<sx<<" "<<sy<<endl;
	else cout<<-1;
	return 0;
}

标签:ssy,题解,s1,pos,20010,abc347,s2,数位
From: https://www.cnblogs.com/Jh763878/p/18106521

相关文章

  • AT_abc347_e的题解
    (一)可能因为我太菜了,感觉D>E。用\(vis_i\)表示\(i\)是否出现,\(sum_i\)表示当前集合大小。用vector维护出现的区间的端点。将\(sum\)数组前缀和即可。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,q,x,siz,sum[200010];......
  • BZOJ4977 跳伞求生题解
    传送门题意:有\(n\)个队友和\(m\)个敌人,每个队友\(i\)有\(a_i\)颗子弹。敌人\(j\)有\(b_j\)颗子弹。队友击杀敌人,必须\(a_i>b_j\),然后会获得\(a_i-b_j+w_j\)的收益。(\(w_j\):每个敌人都有一个参数)每个队友只能打一个敌人,可以不打。求最大收益。【费用流模型......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第七、八章
    概述    本文主要提供《C语言程序设计》(浙大版)第七、八章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第九、十章节的课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客​http://t.cs......
  • 提问的力量:驱动问题解决、核心发现与创新启示
    目录问题解决的驱动力:提问的力量提问的力量:催生解决方案的火花提问的力量:启发新思想的源泉核心发现的推动力:提问的力量提问的力量:推动科学探索与发现提问的力量:揭示历史真相创新启示:提问的力量提问的力量:激发创新思维提问的力量:推动社会进步探索篇:提问与问题解决—......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第五、六章
    概述   本文主要提供《C语言程序设计》(浙大版)第五、六章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第七、八章节课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客http://t.csdnimg......
  • AT_abc347_e 题解
    很水。一个las数组,记录a[i]这个数上一次被加入是什么时候。注意,为防误判,在a[i]被删除的时候,将las[a[i]]设为\(0\)。你也可以这么理解:las是记录在哪出现的visit数组。每次加入一个数的时候,\(\left|S\right|\)就加\(1\),并且使las[a[i]]等于i。删除时,\(\left|S......
  • AT_abc347_c 题解
    最开始的思路爆炸了我就不写了。先d[i]%=(a+b)。然后,排序,破环为链,相当于存储了下一周。再然后,从\(1\)到\(n\)进行一个循环,若d[i+n-1]-d[i]+1<=a就输出Yes。它的原理是什么?翻译一下上面那个语句,就是“我前一个任务的日期的下一周距离我这个任务的日期小于等于节假日天......
  • ABC347题解
    省流:输+赢D按位分析。既然两个数异或后的结果是\(C\),那就考虑\(C\)中为\(1\)的数中有几个是在\(X\)当中的。假如\(\text{a-popcnt(X)==b-popcnt(Y)}\),那么在\(C\)中为\(0\)的数中随便选\(\text{a-popcnt(x)}\)个即可。注意longlong。codeE假如......
  • CF712E Memory and Casinos 题解
    假设只保留数组上\([l,r]\)的这段数,记\(f_i\)表示从点\(i\)出发到达\(n+1\)的概率,则有\(f_0=0,f_{n+1}=1,f_i=(1-p_i)f_{i-1}+p_if_{i+1}\),题目要求的是\(f_1\)。考虑对最后一个等式进行一些变换,把\(f_i\)的系数拆开得:\[p_if_i+(1-p_i)f_i=(1-p_i)f_{i-1}+p_if_{i+1......
  • ABC347G题解
    我不会,但是我会退火!第一眼,\(n\le20\)。退火,启动!大致思路就是随机选一个初始为0的数置为\(1\sim5\)中的某个数,显然图中没有0一定不比有0劣(把所有0改成同一个数一定不劣)。然后把单次计算的复杂度从\(O(n^2)\)变成\(O(1)\):更新有变化位置的值就行了。瞎调调参数......