F. Anton and School 位运算 + 化简
http://codeforces.com/contest/734/problem/F
因为 x + y = (x & y) + (x | y)
有了这个公式后,然后应该手动模拟一下,把公式化简。一开始的时候知道有这个公式,但是自己却不动手。动手能力太差。思考能力太弱了。
如果你肯动手,这题是可以化简的,当然后面的还需要一些技巧来判断
b[i] + c[i] = (a[i] + a[j] )(1 <= j <= n)
这是根据我们的公式得来的。
所以b[i] + c[i] = n * a[i] + suma
然后对n个式子求和。(sumb + sumc - n * suma) / n = suma
所以就能得到suma = (sumb + sumc) / (2 * n)
所以就能每个每个算出a[i]
算完后,还要判断下a[i]是否合法。
比如
3
5
这样你算出来的是4,但是是不合法的
所以要检验下,检验的时候暴力是O(n * n),要技巧。
就是,比如
10110
01110
10111
01000
把a[i]都弄成二进制。
如果是 & 操作。
对于第一个数,就是b[1]
如果当前位是0,那什么都不用说了,不贡献,
如果是1,那么,记cnt[k]表示那一位有多少个,比如cnt[1] = 3
此时的贡献是cnt[1] * (1 << j)个。
|的操作类似,不过如果当前位是1,就要加上n * (1 << j),否则就和上面的差不多了。
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <assert.h>
- #define IOS ios::sync_with_stdio(false)
- using namespace std;
- #define inf (0x3f3f3f3f)
- typedef long long int LL;
- #include <iostream>
- #include <sstream>
- #include <vector>
- #include <set>
- #include <map>
- #include <queue>
- #include <string>
- const int maxn = + ;
- int b[maxn];
- int c[maxn];
- int a[maxn];
- int t[maxn];
- int n;
- bool dp[maxn][];
- int cnt[];
- bool check() {
- for (int i = ; i <= n; ++i) {
- for (int j = ; j <= ; ++j) {
- dp[i][j] = a[i] & ( << j);
- cnt[j] += dp[i][j];
- }
- }
- for (int i = ; i <= n; ++i) {
- int tb = ;
- int tc = ;
- for (int j = ; j <= ; ++j) {
- if (dp[i][j]) {
- tc += ( << j) * n;
- } else {
- tc += ( << j) * cnt[j];
- }
- if (dp[i][j] == ) continue;
- tb += ( << j) * cnt[j];
- }
- if (tb != b[i] || tc != c[i]) {
- return false;
- }
- }
- return true;
- }
- void work() {
- // printf("%d\n", 1 << 30);
- cin >> n;
- LL sum = ;
- for (int i = ; i <= n; ++i) {
- cin >> b[i];
- sum += b[i];
- }
- for (int i = ; i <= n; ++i) {
- cin >> c[i];
- t[i] = b[i] + c[i];
- sum += c[i];
- }
- if (sum % ( * n) != ) {
- printf("-1\n");
- return;
- }
- LL tsum = sum / ( * n);
- for (int i = ; i <= n; ++i) {
- if (t[i] - tsum < || (t[i] - tsum) % n != ) {
- printf("-1\n");
- return;
- }
- a[i] = (t[i] - tsum) / n;
- }
- if (!check()) {
- cout << "-1" << endl;
- return;
- }
- for (int i = ; i <= n; ++i) {
- cout << a[i] << " ";
- }
- }
- int main() {
- #ifdef local
- freopen("data.txt", "r", stdin);
- // freopen("data.txt", "w", stdout);
- #endif
- work();
- return ;
- }
F. Anton and School 位运算 + 化简的更多相关文章
- matlab化简符号表达式
化简符号表达式计算机毕竟还是挺笨的, 经过一系列的符号计算后, 得到的结果可能只有它自己才能看懂, Matlab提供大量函数以用于符号表达式的化简. collect(f): 函数用途是合并多项式中相同 ...
- 【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)
简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简.是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于grou ...
- Codeforces F. Bits And Pieces(位运算)
传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...
- poj3708:函数式化简+高精度进制转换+同余方程组
题目大意 给定一个函数 找出满足条件 等于 k 的最小的x m,k,d已知 其中 m,k 很大需要使用高精度存储 思路: 对 函数f(m)进行化简 ,令t=ceil( log(d,m) ) 可以得 ...
- Java位运算实现加减乘除
一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...
- 深入V8引擎-枚举+位运算实现参数配置
不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持.为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白. 基本上从初始化引擎,到Isolate.handleScope ...
- Codeforces 878A - Short Program(位运算)
原题链接:http://codeforces.com/problemset/problem/878/A 题意:给出n个位运算操作, 化简这些操作, 使化简后的操作次数不多于5步. 思路:我们可以对二进 ...
- 简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
- javascript位运算
javascript作为一门高级语言,他尽量让开发人员减少思考底层的硬件工作原理,而将精力集中在逻辑开发的层面.不过,不论这门语言多么高级,我们必须知道数据依然以bits的形式存储,有时候我们会直接与 ...
随机推荐
- linux以及git和maven常用命令
maven常用命令: clean install -Dmaven.test.skip -Ptest-lx (注意:test-lx是pom文件名) 其他 https://www.cnblogs.co ...
- spring MVC (学习笔记)
web.xml 相关配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns=" ...
- Ehcache CacheManager
CacheManager是Ehcache框架的核心类和入口,它负责管理一个或多个Cache对象.要使用Ehcache框架,必须要先创建 CacheManager 对象.现在我们学习下,如何创建 Cac ...
- filename extension
题目描述 Please create a function to extract the filename extension from the given path,return the extra ...
- centos 网络连接查看
安装iftop. 这个得先安装epel #yum install epel-replease -y #yum install iftop -y #iftop
- 小玩Spring Boot
Spring Boot是Spring Mvc的升级版 号称是替代者 也是微服务的微框架基础 有3启动方式 用IntelJ IDEA 生成spring boot工程 1.有个入口类 可以直接run as ...
- oracle:os认证用户登录测试
90%的情况下,我们使用的都是数据库认证用户登录oracle,但还存在使用OS认证用户登录oracle的情况: 下面就实验一下OS用户要登录oracle相关操作: 测试环境:oracle10. ...
- 让振动器振动起来——Vibrator的使用
AndroidManifest.xml 获取系统权限 <uses-permission android:name="android.permission.VIBRATE"/& ...
- 哈希表的C实现(一)
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
- C++ 下啥时候用struct, 啥时候用class
struct 由c语言引入.在c语言中,是定义结构化数据的标准选择. c++ 同时支持struct 和 class. 原因之一是c++ 是 c 的超集,涵盖c 已支持的语言要素,将更好的支持向下兼容( ...