D-triples

题意

给你一个\(n\),问至少有几个数或运算起来可以等于\(n\),并且输出数量和这个几个数。题目说明给的\(n\)一定符合条件(不会输出\(n= 1\) 之类不存在情况)。

思路

  • 我们打个表就能知道n至少可以由\(1\)个或者\(2\)个数或起来。

  • 首先我们预先判断\(n \% 3 == 0\)这种输出\(n\)自己本身就可以了

  • 其它的数可以由\(2\)个数进行或运算得到。

    1. 把\(n\)转换为二进制,把每一位上1提取出来放到集合\(R\)
    2. 找到两个集合\(a、b\),\(a\cup b = R\)

      \(num1 = \sum_{i=0}^{a.size()} x_{i} (x_{i}\in a)\)

      \(num1 \% 3 == 0\)

      \(num2 = \sum_{i=0}^{b.size()} y_{i} (y_{i}\in b)\)

      \(num2 \% 3 == 0\)
    3. 再分别把\(a、b\)集合里的数加起来就是答案了。

样例(解决WA到哭的两个样例)

2
85
682
(1010101、1010101010)上面两个样例的二进制

AC代码

#include<bits/stdc++.h>
#define mes(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
int a[100];
int ans[3]; void solve(ll x){ //转换n为二进制
int i = 0;
while(x){
a[i++] = x%2;
x /= 2;
}
}
int main(){
int t;
ll n;
scanf("%lld", &t);
while(t--){
scanf("%lld", &n);
if(n % 3ll == 0){
printf("1 %lld\n", n);
continue;
}
mes(a, 0);
solve(n);
ans[1] = ans[2] = 0; //分别计算二进制位为1的数字取模3分别为1和2的数量
for(int i = 0; i <= 64; i++){
if(a[i] == 1){
int num = (1ll<<i)%3ll;
ans[num]++;
}
}
int sum = ans[1] + ans[2]*2;
int b[3][3];
mes(b, 0);
if(sum % 3 ==1){ //强行分组(本人比较菜只会这样写)
if(ans[1] == 0){
b[1][1] = 0;
b[1][2] = ans[2] - 2;
b[2][1] = 0;
b[2][2] = 3;
}
else{
b[1][1] = ans[1]-1;
b[1][2] = ans[2];
if(ans[2] == 0){
b[2][1] = 3;
}
else{
b[2][1] = 1;
b[2][2] = 1;
}
}
}
else if(sum %3 == 2){
if(ans[2] == 0){
b[1][1] = ans[1]-2;
b[1][2] = 0;
b[2][1] = 3;
b[2][2] = 0;
}
else{
b[1][1] = ans[1];
b[1][2] = ans[2]-1;
if(ans[1] == 0){
b[2][1] = 0;
b[2][2] = 3;
}
else{
b[2][1] = 1;
b[2][2] = 1;
}
}
}
ll num1 = 0, num2 = 0;
for(int i = 0; i < 64; i++){
if(a[i] == 1){
int num = (1ll<<i)%3;
if(b[2][num] == ans[num]){
num2 += (1ll<<i);
b[2][num]--;
}
if(b[1][num] > 0){
num1 += (1ll<<i);
b[1][num]--;
}
ans[num]--;
}
}
printf("2 %lld %lld\n", num1, num2);
}
return 0;
}

2019牛客多校第四场D-triples I 贪心的更多相关文章

  1. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  2. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  3. 2019牛客多校第四场B xor——线段树&&线性基的交

    题意 给你 $n$ 个集合,每个集合中包含一些整数.我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数.现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ ...

  4. 2019牛客多校第四场J free——分层图&&最短路

    题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...

  5. 2019牛客多校第四场A meeting——树的直径

    题意: 一颗 $n$ 个节点的树上标有 $k$ 个点,找一点使得到 $k$ 个关键结点的最大距离最小. 分析: 问题等价于求树的直径,最小距离即为直径除2向上取整. 有两种求法,一是动态规划,对于每个 ...

  6. [2019牛客多校第四场][G. Tree]

    题目链接:https://ac.nowcoder.com/acm/contest/884/G 题目大意:给定一个树\(A\),再给出\(t\)次询问,问\(A\)中有多少连通子图与树\(B_i\)同构 ...

  7. 2019牛客多校第四场C-sequence(单调栈+线段树)

    sequence 题目传送门 解题思路 用单调栈求出每个a[i]作为最小值的最大范围.对于每个a[i],我们都要乘以一个以a[i]为区间内最小值的对应的b的区间和s,如果a[i] > 0,则s要 ...

  8. 2019牛客多校第四场K number dp or 思维

    number 题意 给一个数字串,问有几个子串是300的倍数 分析 dp写法:这题一看就很dp,直接一个状态dp[i][j]在第i位的时候膜300的余数是j左过去即可.这题比赛的时候样例老是少1,后面 ...

  9. 2019牛客多校第四场J free 最短路

    free 题意 给出一个带权联通无向图,你需要从s走到t,你可以选择k条变让他们的权值为0问从s到t的最小权值是多少? 分析 思考一下,如果不带k条白嫖这个条件,那么这就是一个简单的dji就搞定了,我 ...

随机推荐

  1. linux系统下jdk安装配置

    1.有jdk包(linux版) 2.放到linux系统下 3.建议在usr下新建jdk目录之后将jdk文件放到该目录下 3.配置系统信息   /etc/profile 需要配置的信息如下:#set j ...

  2. this.$nextTick 与window.setTimeout

    两个都可以设置运行先后.前者,方式: this.$nextTick(() => { this.$refs.orgAddOrUpdate.init(row, isAdd) }) 其中orgAddO ...

  3. Equivalent Prefixes

    题目链接 题意:给你两个数组a,b,大小为n,让你寻找一个数p (1<= p <= n) ,使之在 1~p 任意一个区间中a,b数组的最小值下标相同. 思路:看到用线段树去写的我也是服了. ...

  4. LocalActivityManager如何在一个Activity的一部分中显示其他Activity

    首先要使用该方法,页面必须继承ActivityGroup. 总的来说,实现"如何在一个Activity的一部分中显示其他Activity"除了LocalActivityManage ...

  5. ANTLR4在windows10下的安装

    1.下载ANTLR ①.从官网下载到最新版本的antlr-4.7.1-complete.jar.我下载的时候最新版本是4.7.1. ②.选择路径保存,为方便之后修改环境变量.我的下载目录为E:\Ant ...

  6. linux知识总结与问题总结

    一直以来经常听到LINUX,但是自己学习的也不深,也没有花时间来梳理一下自己的理解.趁着新年这段时间,好好梳理一下. 在理解LINUX前,先简单理解一下 一:操作系统这个概念. 操作系统就是与电脑中的 ...

  7. linux超级块和inode 详解 和 df 、du 命令详解与环境变量

    一.inode块,Unix文件的核心. 首先需要明白的是,在Unix操作系统中的任何资源都被当作文件来管理.如目录.光驱.终端设备等等,都被当作是一种文件.从这方面来说,Unix操作系统中的所有的目录 ...

  8. Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  9. Django-自定义用户模型

    Django最方便的一点,是自带用户系统,但有些情况下,不符合项目需求, 原因1.我们有时候需要自定义一些字段,或者删除Django自带字段,2.我们有时候需要定义哪些字段是必填的,登陆时的用户名是哪 ...

  10. Lock的使用

    Lock是一个Java类,synchronized是一个Java关键字,两者有本质的不同 Lock需要手动释放锁,synchronized是自动释放锁 Lock适合大量同步的代码同步,synchron ...