2 条题解
-
6huhe (小小苦力怕) LV 1 @ 2022-2-11 23:59:13
本题太难了现在是2/12 0:08
死磕了半天终于……还是没搞懂
终于我想到了他——位运算
用one代表只出现一次的数位,two代表出现了两次的数位,three代表出现了三次的数位.
废话不多,上代码
#include<bits/stdc++.h> using namespace std; int aa; int main(){ int n,one=0,two=0,three=0; cin>>n; for(int i=1;i<=n;i++){ cin>>aa; two^=(one&aa); one^=aa; three=~(one&two); two&=three; one&=three; } cout<<one; }
小知识,大世界:
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
下表显示了支持的位运算符.假设变量的值为60,变量的值为13,则:
& 如果同时存在于两个操作数中,二进制运算符复制一位到结果中.(A & B)将得到 12,即为00001100
如果存在于任一操作数中,二进制 运算符复制一位到结果中.(A | B)将得到61,即为00111101
^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中.(A ^ B)将得到49,即为00110001
二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0.(~A )将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式
二进制左移运算符。左操作数的值向左移动右操作数指定的位数.A << 2将得到 240,即为11110000
二进制右移运算符.左操作数的值向右移动右操作数指定的位数.A >> 2将得到15,即为00001111
-
22022-7-3 22:41:29@
#include <math.h> #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int a[100]; long long calc() { long long sum =0; for(int i = 0 ; i < 60 ; i++) { a[i] %= 3; if(a[i]) sum += (1 << i); } return sum; } void f(long long x) { long long len = 0; while(x!=0) { if(x&1) a[len]++; len++; x/=2; } } int main() { long long n ; cin >> n; for(long long i = 0,x ; i < n ; i++) { scanf("%d",&x); f(x); } cout << calc() <<endl; return 0; }
- 1
信息
- ID
- 1224
- 时间
- 1000ms
- 内存
- 5MiB
- 难度
- 7
- 标签
- 递交数
- 299
- 已通过
- 69
- 上传者