【BZOJ 3107】【CQOI 2013】二进制a+b

2023-10-07 15:58
文章标签 二进制 bzoj 2013 cqoi 3107

本文主要是介绍【BZOJ 3107】【CQOI 2013】二进制a+b,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上的写法都是dp,然后发现一个构造写法,太稳了ORZ
http://blog.csdn.net/PoPoQQQ/article/details/48006557
具体的证明可以看这个博客,我这里就只写构造方法了。

首先答案只和a、b、c二进制中1的数量有关,不妨设为x、y、z且x>=y。
分成三种情况(几种特殊情况也能包括进去):

1<=z<=y

0–0000–11111111–111111
0–1111–00000000–111111
1–0000–00000000–111110
从左到右分别有1位、y-z位、x-z位、z位。

res = 1 << (x + y - z);
res = res + (1 << z) - 2;

y<z<=x

0–11111–1111111–11111
0–00000–1111111–00000
1–00000–1111110–11111
从左到右分别有1位、x-z位、y位、z-y位。
实际上去掉最后z-y位就和上面的一模一样了。

res = 1 << x;
res = res + (((1 << y) - 2) << (z - y));
res = res + (1 << (z - y)) - 1;

x<z<=x+y

0–11111–11111111–0000
0–11111–00000000–1111
1–11110–11111111–1111
从左到右分别有1位、x+y-z位、z-y位、z-x位。

res = (1 << (z + 1)) - 1;
res = res - (1 << (z + z - x - y));

有两种情况是无解的:
1、z>x+y,这不废话么。。。
2、答案所需位数小于位数上限,也就是说答案太长了放不下。

#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define N 100000
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
int a,b,c,x,y,z,res,lim;
int calc(int x)
{int res = 0;while (x) {if (x&1) res++; x = x >> 1;}return res;
}
int dgt(int x)
{int res = 0;while (x) {res++; x = x >> 1;}return res;
}
int main()
{scanf("%d%d%d",&a,&b,&c);lim = max(dgt(a),max(dgt(b),dgt(c)));x = calc(a); y = calc(b); z = calc(c);if (x < y) swap(x,y);if (z <= y){res = 1 << (x + y - z);res = res + (1 << z) - 2;} elseif (z <= x){res = 1 << x;res = res + (((1 << y) - 2) << (z - y));res = res + (1 << (z - y)) - 1;} elseif (z <= x + y){res = (1 << (z + 1)) - 1;res = res - (1 << (z + z - x - y));} else {printf("-1\n"); return 0;}if (dgt(res) > lim) printf("-1\n"); else printf("%d\n",res);return 0;
}

这篇关于【BZOJ 3107】【CQOI 2013】二进制a+b的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/158835

相关文章

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

通信工程学习:什么是2ASK/BASK二进制振幅键控

2ASK/BASK:二进制振幅键控         2ASK/BASK二进制振幅键控是一种数字调制技术,其全称是二进制振幅键控(Binary Amplitude Shift Keying)。该技术通过改变载波的振幅来传递二进制数字信息,而载波的频率和相位则保持不变。以下是关于2ASK/BASK二进制振幅键控的详细解释: 一、2ASK/BASK二进制振幅键控的基本原理 1、振幅键控:

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

二进制的匹配问题

最近做了点搜索和背包的题目,发现这个二进制的匹配很是好用,所以写一篇二进制的匹配来作为自我总结; 首先我们要知道二进制的运算符,和他们的运算规则; ABA&BA|BA^B00000010111001111110 运算符有三种‘&’ , ‘|’ ,  ‘^'  或,且,异或,运算的规则在表中可以看到,想想这个规则我们可以做很多事情! 首先,每个十进制的数都会对应一个唯一的二进

二进制方式安装Helm

二进制方式安装Helm 官网:https://helm.sh/ 1、下载安装包 wget -L https://get.helm.sh/helm-v3.16.0-rc.1-linux-amd64.tar.gz 2、解压 tar -xf helm-v3.16.0-rc.1-linux-amd64.tar.gz 3、移动到/usr/local/bin/目录下 mv linux-am

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。

/*** 输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。* 思路:第一步求这两个数的异或,第二步统计异或结果中1的位数*@author: Administrator*@date: 2017-1-13 下午09:39:25*/import java.util.Scanner;public class Solution4 {public int CountDifference

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

Java 二进制,八进制,十进制,十六进制之间的相互转换

package com.sjd.JinzhiZhuanhuan;public class JinzhiZhuanhuan {//二进制转八,十,十六进制---开始public void fromBinaryToOctalSting(String str1) {String result=Integer.toOctalString(Integer.parseInt(str1, 2));System.

JAX-WS - 二进制处理之MTOM(文件上传)

一、一般模式     服务端: import javax.jws.WebService;@WebServicepublic interface UploadService {public void upload(byte[] file);} import java.io.File;import java.io.FileOutputStream;import java.io.IOEx