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. Java Web学习总结(1)Tomcat使用教程

    一,简介 Tomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.因 ...

  2. 4412 使用小度wifi

    本文转载至:https://blog.csdn.net/robertsong2004/article/details/42985223 作者:刘老师,华清远见嵌入式学院讲师. FS_4412可以同链接 ...

  3. 八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)

    一.std::condition_variable 用在多线程中. 线程A:等待一个条件满足 线程B:专门在消息队列中扔消息,线程B触发了这个条件,A就满足条件了,可以继续执行 std::condit ...

  4. linux 基础知识及命令总结

    1.mkdir   创建目录 -p 创建多级目录  mkdir -p /data/test -m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask -p, ...

  5. 6105 - deauth after EAPOL key exchange sequence

    wifi无法连接公司的网络 Warning Error in Event Log - deauth after EAPOL key exchange sequence https://forums.i ...

  6. h5调用微信支付功能

    支付按钮的点击事件 $(´.Save_Patient_Msg´).click(function(){ $(´.Save_Patient_Msg´).off(´click´); var hrdfId = ...

  7. Linux查看文件大小5个常用命令

    1. 前言 Linux 系统有非常好用的命令,功能也非常丰富,如果你对命令行工具熟悉,可以非常高效率完成维护工具.本文主要介绍Linux系统中,用于查看文件大小的命令. Linux 查看文件大小5个常 ...

  8. ZwQueryDirectoryFile用法

    1. 当返回值为STATUS_SUCCESS时,返回的字节数保存在IoStatusBlock.Information字段中: 2. 如果FileName字段被指定了,那么对于同时指定的FileHand ...

  9. 在虚拟机的Linux系统下安装wineqq

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 本文参考教程:http://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread& ...

  10. Java开发用H2数据库

    #JPA Configuration:#spring.jpa.database=MySQLspring.datasource.url=jdbc:h2:mem:jpaspring.datasource. ...