题目链接:http://codeforces.com/contest/897/problem/C

题意:

  给你一些字符串:

    A: [What are you doing at the end of the world? Are you busy? Will you save us?]

    B: [What are you doing while sending "]

    C: ["? Are you busy? Will you send "]

    D: ["?]

  (中括号内为给出的字符串,问号、引号、空格也算在内)

  定义字符串f[0] = A,递推式f[n] = B + f[n-1] + C + f[n-1] + D

  比如:

    f[0] = [What are you doing at the end of the world? Are you busy? Will you save us?]

    f[1] = [What are you doing while sending "What are you doing at the end of the world? Are you busy? Will you save us?"? Are you busy? Will you send "What are you doing at the end of the world? Are you busy? Will you save us?"?]

  然后有q个询问,每个询问有两个整数n,k,让你输出f[n]的第k个字符。如果f[n]没有第k个字符,则输出'.'。

题解:

  定义la,lb,lc,ld分别代表字符串A,B,C,D的长度:

    la=75, lb=34, lc=32, ld=2

  定义len[i]为字符串f[i]的长度,很容易推出len[i] = (2^i)*la + (2^i - 1)*(lb + lc + ld)。

  因为len[i]有可能很大,而k只有10^18,所以当i>=54的时候,直接返回一个很大的数就行了(比如9e18)。

  对于每个询问,先判断是否k >= len[n]。如果是,直接输出'.'。

  否则就从后往前推位置。

  因为f[n] = B + f[n-1] + C + f[n-1] + D

  所以当前位置k在f[n]中的位置有5种情况:

    (1)k在B中,即k∈[1, lb]

    (2)k在第一个f[n-1]中,即k∈[lb+1, lb+len[n-1]]

    (3)k在C中,即k∈[lb+len[n-1]+1, lb+len[n-1]+lc]

    (4)k在第二个f[n-1]中,即k∈[lb+len[n-1]+lc+1, lb+len[n-1]*2+lc]

    (5)k在D中,即k∈[lb+len[n-1]*2+lc+1, lb+len[n-1]*2+lc+ld]

  对于情况1,3,5,找到k在B,C,D中对应的位置,输出即可:

    (1)k不变

    (3)k -= lb+len[n-1]

    (5)k -= lb+len[n-1]*2+lc

  对于情况2,4,将k变成在f[n-1]中的位置,继续执行这种变换即可。

    (2)k -= lb

    (4)k -= lb+len[n-1]+lc

  最多变换n次,所以总复杂度为O(qn)。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; long long n,k,q;
long long la=,lb=,lc=,ld=;
string a=" What are you doing at the end of the world? Are you busy? Will you save us?";
string b=" What are you doing while sending \"";
string c=" \"? Are you busy? Will you send \"";
string d=" \"?";
string s; long long len(long long i)
{
if(i>=) return 9000000000000000000LL;
return ((1LL<<i)-1LL)*(la+lb+lc+ld)+la;
} inline bool cont(long long x,long long l,long long r)
{
return l<=x && x<=r;
} int main()
{
cin>>q;
while(q--)
{
cin>>n>>k;
if(k>len(n))
{
s+=".";
continue;
}
long long form=;
for(long long i=n;i>=;i--)
{
long long temp=len(i-);
bool flag=false;
if(cont(k,,lb)) form=,flag=true;
if(cont(k,lb+temp+,lb+temp+lc)) k-=lb+temp,form=,flag=true;
if(cont(k,lb+temp*+lc+,lb+temp*+lc+ld)) k-=lb+temp*+lc,form=,flag=true;
if(flag) break;
if(cont(k,lb+,lb+temp)) k-=lb;
if(cont(k,lb+temp+lc+,lb+temp*+lc)) k-=lb+temp+lc;
}
if(form==) s+=a[k];
if(form==) s+=b[k];
if(form==) s+=c[k];
if(form==) s+=d[k];
}
cout<<s<<endl;
}

Codeforces 897C Nephren gives a riddle:模拟【珂学】的更多相关文章

  1. CodeForces - 896A Nephren gives a riddle

    A. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  2. Codeforces Round #449 (Div. 2)-897A.Scarborough Fair(字符替换水题) 897B.Chtholly's request(处理前一半) 897C.Nephren gives a riddle(递归)

    A. Scarborough Fair time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Codeforces Round #449 [ C/A. Nephren gives a riddle ] [ D/B. Ithea Plays With Chtholly ]

    PROBLEM C/A. Nephren gives a riddle 题 http://codeforces.com/contest/896/problem/A codeforces 896a 89 ...

  4. CF&&CC百套计划1 Codeforces Round #449 A. Nephren gives a riddle

    http://codeforces.com/contest/896/problem/A 第i个字符串嵌套第i-1个字符串 求第n个字符串的第k个字母 dfs #include<map> # ...

  5. jzoj5988. 【WC2019模拟2019.1.4】珂学计树题 (burnside引理)

    传送门 题面 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_ ...

  6. JZOJ5988 珂学计树题

    题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...

  7. codeforces 723B Text Document Analysis(字符串模拟,)

    题目链接:http://codeforces.com/problemset/problem/723/B 题目大意: 输入n,给出n个字符的字符串,字符串由 英文字母(大小写都包括). 下划线'_' . ...

  8. Codeforces Round #304 C(Div. 2)(模拟)

    题目链接: http://codeforces.com/problemset/problem/546/C 题意: 总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张 ...

  9. Codeforces 749C:Voting(暴力模拟)

    http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...

随机推荐

  1. Android开发和Android Studio使用教程

    Android studio安装和简单介绍http://www.jianshu.com/p/36cfa1614d23 是时候把Android 项目切换到Android Studio http://ww ...

  2. MySQL_知识点

    1.执行顺序 语句模板: (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)& ...

  3. nginx 查看接口请求时间 每个请求图片的时间或者文件的

    根据nginx的access_log查看接口请求时间 muyuren 发表于 1年前 阅读 2300 收藏 0 推荐 0 评论 0 推荐 收藏 首先修改修改生成日志的格式,在nginx配置文件的htt ...

  4. hasOwnProperty()与in操作符的区别

    hasOwnProperty()  判断属性是否是实例化(不包括原型)的属性, 存在会返回true; 否则, 返回false in  无论属性是存在实例本身中, 还是原型对象中, 存在会返回true; ...

  5. FreeSWITCH 基础

    [1]FreeSWITCH 是什么? FreeSWITCH是一个开源的电话交换平台. 世界上第一个跨平台的.伸缩性极好的.免费的.多协议的电话软交换平台. 从技术上讲,FreeSWITCH是一个B2B ...

  6. 什么是scale up和scale out

    Scale Out(也就是Scale horizontally)横向扩展,向外扩展Scale Up(也就是Scale vertically)纵向扩展,向上扩展无论是Scale Out,Scale Up ...

  7. git 撤销已经push到远端的代码

    其实是没有直接让远端代码回复到某次的指令,实现撤销push的思路如下: 1.先让代码恢复到想要恢复的前一次提交记录 2.重新提交代码,覆盖端上的代码,就相当于撤销了push 的提交 实现方式如下: 1 ...

  8. shader随记

    o.WorldPos = normalize(mul((float4x4)unity_ObjectToWorld, v.vertex)).xyz;

  9. mysql 不同库不同表字段数据复制

    需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_fold ...

  10. Laravel开发:Laravel核心——服务容器的细节特性

    前言 在前面几个博客中,我详细讲了 Ioc 容器各个功能的使用.绑定的源码.解析的源码,今天这篇博客会详细介绍 Ioc 容器的一些细节,一些特性,以便更好地掌握容器的功能. 注:本文使用的测试类与测试 ...