Tautonym Puzzle

Time Limit: 50 Sec  Memory Limit: 256 MB

Description

  定义一个序列贡献为1,当且仅当这个序列 由两个相同的串拼接而成,比如123123。
  请构造一个序列,使得它子序列的贡献和为n。
  要求序列长度<=200,权值<=100.

Input

  一行一个n。

Output

  第一行为长度len,表示你构造出的序列长度。

  第二行为你构造出的序列。

Sample Input

  7

Sample Output

  4
  1 1 1 1

HINT

  n <= 1e12

Solution

  构造题到恰好为n的。一般有两种方法:
    1. 可以构造出2^n,并且每部分互不影响;
    2. 有方法添加若干元素使得原有答案*2或+1。

  我们先考虑第一种方法。
  显然我们把 n 化为二进制。并且发现连续 x 个相同的数提供的贡献为2^(x-1)-1,并且若干个连续的不影响
  这样 s 需要1+2+……+log2(n)+(log2(n) * 2)(用于补1),极限是900。不能满足条件。

  我们再考虑第二种方法。
  s<=200,权值<=100。长度有5 * log2(n)可用,权值有2 * log2(n)可用。
  先考虑这样一个问题:
    <p1,p2,…,pk>已经是一个排列了,我们在后面加上<1,2,…,k>之后的贡献是多少
  显然,此时贡献为:<p1,p2,…,pk>的上升序列的个数
  那么我们把问题转化为:构造一个上升序列个数为n的排列

  假设我们原来的排列<p1,p2,…,pk>已经x个上升序列了,现在填入k+1

  显然,在前面填一个k+1贡献会变为:x+1。完成了+1部分。
  显然,在最后填一个k+1贡献会变为:x*2+1,这里多了一个+1。怎么办呢?

  显然一开始是0,经过3次操作0*2+1=1,1*2+1=3,3*2+1=7
  假设一开始是1,经过3次操作1*2=2,2*2=4,4*2=8

  发现我们如果将初值1的话,我们每次x*=2最后再-1和原来的效果是一样的。这样就完成了*2部分。

  最后用一个递归即可。

Code

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
using namespace std;
typedef long long s64; const int ONE = ; int get()
{
int res = , Q = ; char c;
while( (c = getchar()) < || c > )
if(c == '-') Q = -;
if(Q) res = c - ;
while( (c = getchar()) >= && c <= )
res = res * + c - ;
return res * Q;
} s64 n;
int now;
deque <int> q; void Solve(s64 n)
{
if(n == ) return;
if(n & ) Solve(n - ), q.push_front(++now);
else Solve(n / ), q.push_back(++now);
} int main()
{
cin >> n;
Solve(++n);
printf("%d\n", now << );
while(!q.empty())
printf("%d ", q.front()), q.pop_front();
for(int i = ; i <= now; i++)
printf("%d ", i);
}

【AtCoder Grand Contest 012C】Tautonym Puzzle [构造]的更多相关文章

  1. Atcoder Grand 012 C - Tautonym Puzzle

    题意: 构造一个字符串,使得这个字符串有只有n个形如AA这样的子序列. 神TM构造题不会做,, 我们构造一个长度为2*m的字符串,前m个是一个1-m的排列,后m个就是按顺序1-m. 这样这个串里符合要 ...

  2. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  3. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  4. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  5. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  6. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

  7. AtCoder Grand Contest 006

    AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...

  8. AtCoder Grand Contest 004

    AtCoder Grand Contest 004 A - Divide a Cuboid 翻译 给定一个\(A*B*C\)的立方体,现在要把它分成两个立方体,求出他们的最小体积差. 题解 如果有一条 ...

  9. AtCoder Grand Contest 002

    AtCoder Grand Contest 002 A - Range Product 翻译 告诉你\(a,b\),求\(\prod_{i=a}^b i\)是正数还是负数还是零. 题解 什么鬼玩意. ...

随机推荐

  1. Python3.6 AES加密 pycrypto‎ 更新为 pycrypto‎demo | TypeError: Object type <class 'str'> cannot be passed to C code

    #!/usr/bin/env python# -*- coding:utf-8 -*-# @author: rui.xu# @update: jt.huang# 这里使用pycrypto‎demo库# ...

  2. jQuery : 有关TypeError: invalid ‘in’ operand obj的错误

    参考 lwx2615 的博客 ,网站:  http://blog.csdn.net/lwx2615/article/details/9668777 由PHP返回一个json数据 $.ajax({ ur ...

  3. 微信小程序 功能函数 定时震动

    ffn: function () { let nnn = this.data.nnn nnn += 1; this.setData({ nnn: nnn }); if (nnn > 10) { ...

  4. java 数据结构与算法---队列

    原理来自百度百科 一.队列的定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...

  5. input select & input unselect

    input select & input unselect input select https://developer.mozilla.org/en-US/docs/Web/API/HTML ...

  6. 【Linux笔记】ps、kill、netstat、nohup、screen

    1.ps 命令,用于查看当前正在运行的进程,使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等. 语法: ps [options] 示例: p ...

  7. UVAlive3211_Now or later

    白书上的例题. 每种航班可以选择两种时间降落,如果想任意航班降落时间差的最小值最大,应该如何安排? 二分时间,如果两个时间只差小于当前枚举的时间,说明这条边不可选,可以根据2sat的方法构图. 然后判 ...

  8. (转)Python中如何理解if __name__ == '__main__'

    摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...

  9. List、Set、Map

    List:1.可以允许重复的对象.  2.可以插入多个null元素. 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序. 4.常用的实现类有 ArrayList.LinkedLi ...

  10. [CF850F] Rainbow Balls

    题目大意 这里 题解 我们枚举最后剩下的球的种类,那么其他球可以看做没用了. 设选定的球有\(a_i\)个,球的总数为\(s=\sum_{i=1}^n a_i\). 现在问题变为:在一个长度为\(s\ ...