题目大意:

给出一个$N(N <= 2^{22}$),$N$的二进制表示中1的个数不超过4.  一开始有一个集合$S = {N}$, 每次操作可以选择$n\in S \ (n > 1)$, 将$n$拆成两个正整数$n_1$和$n_2$,$n = n1 + n2$, 然后令$S = \{S \setminus n\} \cup \{n_1, n_2\}$.  问最少多少次操作使得$S = \{ 1 \}$.

题解:

考虑将这个过程倒过来,本质是让求一个最短的Brauer chain。考虑一个Brauer chain $a_0, a_1, \dots a_k$, 其中$a_0 = 1$, $ a_k = N$. 首先类似快速幂随便构造一下可以得到一个长度为$s+t-2$的Brauer chain,$s$ 是$N$二进制位数,$t$是二进制表示下1的个数。 比如$N = (1110)_2, s = 4, t = 3$, 可以如下构造:$\{(1)_2, (10)_2, (100)_2, (1000)_2, (1100)_2, (1110)_2\}$. 因此答案上界是$s+t-2$.

进一步挖掘一下性质:

$$s = \lfloor log_{2}{n} \rfloor + 1 , t \le 4$$

$$k \le s + t - 2 \le \lfloor log_{2}{n} \rfloor + 1 + 4 - 2 \le log_{2}{n} + 3$$

可以得到$ a_k \ge  2^{k - 3}$,根据Brauer chain的性质,必须有$a_{i - 1} >= \frac{a_i}{2}$. 从$a_k$倒着推回去可以推出任意$0 \le i \le k$, $a_i \ge 2^{i - 3}$.

爆搜所有满足这个性质且最后一项不超过$2^{22}$的Brauer chain。 发现本地大概要跑50s。

然后想到没必要让$k \le s + t - 2 $取等号,因为等号的情况可以直接构造。所以我们让爆搜的条件更加严格一点,$k < s + t - 2 $ 也就是说$ k \le s + t - 3$. 重新顺着刚才的思路推导一遍得到更强的条件$ a_i \ge  2^{i - 2}$。 然后爆搜就只要0.2s左右了。对于没有搜到的解,直接构造即可。

代码:

 #include <bits/stdc++.h>
using namespace std; #define N 100010
typedef long long LL;
const int mod = ;
const double EPS = 1e-; int a[];
vector<int> ans[( << ) + ]; void DFS(int k)
{
if (k >= && a[k] < ( << (k - ))) return;
if (k > ) return; if (__builtin_popcount(a[k]) <= && (ans[a[k]].size() == || k < ans[a[k]].size()))
{
ans[a[k]].clear();
ans[a[k]] = vector<int>(a, a + k + );
}
for (int i = ; i <= k; ++i)
{
a[k + ] = a[k] + a[i];
if (a[k + ] > ( << )) break;
DFS(k + );
}
} int main()
{
freopen("dividing.in", "r", stdin);
freopen("dividing.out", "w", stdout); a[] = ;
DFS();
for (int i = ; i <= ( << ); ++i)
{
if (__builtin_popcount(i) > || ans[i].size() > ) continue; int j;
for (j = ; ( << j) <= i; ++j)
ans[i].push_back( << j);
j--;
int now = << j;
for (int k = ; k < j; ++k)
{
if ((i >> k) & )
{
now |= << k;
ans[i].push_back(now);
}
}
} int T, d1, d2, d3, d4, n, k;
scanf("%d", &T);
while (T--)
{
scanf("%d %d %d %d", &d1, &d2, &d3, &d4);
n = ( << d1) + ( << d2) + ( << d3) + ( << d4); printf("%d\n", k = ans[n].size() - ); for (int i = k; i >= ; --i)
{
printf("%d %d %d\n", ans[n][i], ans[n][i - ], ans[n][i] - ans[n][i - ]);
}
} return ;
}

2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest D Dividing Marbles的更多相关文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  3. 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D】---暑假三校训练

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D Problem D. Distribution in Metagonia Input ...

  4. 模拟赛小结:2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest

    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest 2019年10月11日 15:35-20:35(Solved 8,Penalty 675 ...

  5. 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest (9/12)

    $$2015-2016\ ACM-ICPC,\ NEERC,\ Northern\ Subregional\ Contest$$ \(A.Alex\ Origami\ Squares\) 签到 //# ...

  6. ACM ICPC 2016–2017, NEERC, Northern Subregional Contest Problem J. Java2016

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:2s 空间限制:256MB 题目大意: 给定一个数字c 用 " ...

  7. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  8. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  9. 2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest Problem F. Format

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229510 时间限制:1s 空间限制:512MB 题目大意: 给定一个字符串,使用%[...] ...

随机推荐

  1. Python Hashtable的理解

           一个对象当其生命周期内的hash值不发生改变,而且可以跟其他对象进行比较时,这个对象就是Hashtable的.两者Hashtable的对象只有具有相同的hash值时才能判断为相同的对象. ...

  2. Error: could not open `C:\Program Files\Java\jre6\lib\i386\jvm.cfg')

    前些日子装了个jdk7试了试,后来做项目需要换成jdk6,安装完jdk6,设置完环境变量后出现问题.运行java -version出现Error: could not open `C:\Program ...

  3. @Resource或者@Autowired作用/Spring中@Autowired注解、@Resource注解的区别

    @Resource或者@Autowired作用不用写set get就能注入,当然,前提是你已经开启了注解功能. spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定 ...

  4. ContentObserver与DatasetObserver区别

        1. ContentObserver ContentObserver主要是通过Uri来监测特定的Databases的表,如果该Databases表有变动则会通知更新cursor中的数据. 如果 ...

  5. 零样本学习 - (Zero shot learning,ZSL)

    https://zhuanlan.zhihu.com/p/41846072 https://zhuanlan.zhihu.com/p/38418698 https://zhuanlan.zhihu.c ...

  6. Hadoop 集群搭建 mark

    Hadoop 集群搭建 原创 2016-09-24 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 目标 在3台服务器上搭建 Hadoop2.7.3 ...

  7. 消息成功失败回调demo

    ) )); try {// ListenableFuture<ResponseEntity<String>> future = restTemplate.postForEnti ...

  8. 计算机系统监控 PerformanceCounter

    PerformanceCounter 컴퓨터 성능 머니터링 CUP Processor 메모리 하터웨어 DB (CPU,User Connection,Batch Request,Blocking ...

  9. The server has either erred or is incapable of performing the requested operation. (HTTP 500)

    感谢朋友支持本博客,欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  10. poj 1636 Prison rearrangement

    Prison rearrangement   Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 2158   Accepted: ...