题目链接: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. hive beeline 的server启动与连接

    启动hiveServer2 启动beeline之后 连接 !connect jdbc:hive2://localhost:10000/default 启动的时候连接 /beeline -u jdbc: ...

  2. 最实用windows 下python+numpy安装(转载)

    最实用windows 下python+numpy安装 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间. 希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+numpy ...

  3. Nginx 配置指令的执行顺序

    在一个 location 中使用 content 阶段指令时,通常情况下就是对应的 Nginx 模块注册该 location 中的“内容处理程序”.那么当一个 location 中未使用任何 cont ...

  4. python 利用pymssql连接MSSQL数据库,简单示例

    #-*- coding:GBK -*- import pymssql print 'Connect to the Datebase....' conn = pymssql.connect(host=' ...

  5. java 十进制转十六进制、十进制转二进制、二进制转十进制、二进制转十六进制

    //10进制转16进制 Integer.toHexString(20); //10进制转2进制 Integer.toBinaryString(10); //16进制转10进制 Integer.pars ...

  6. PHP-Manual的学习----【语言参考】----【类型】-----【Resource 资源类型】

    2017年8月24日11:29:361.资源 resource 是一种特殊变量,保存了到外部资源的一个引用.资源是通过专门的函数来建立和使用的.2.由于资源类型变量保存有为打开文件.数据库连接.图形画 ...

  7. MapReduce Input Split(输入分/切片)具体解释

    看了非常多博客.感觉没有一个说的非常清楚,所以我来整理一下. 先看一下这个图 输入分片(Input Split):在进行map计算之前,mapreduce会依据输入文件计算输入分片(input spl ...

  8. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  9. oracle img 导入dmp文件

    1.新建表空间 因为我们导出的数据表的表空间不一定是USERS, 假如说是:FQDB 新建表空间SQL语句 create tablespace FQDB datafile 'c:\FQDB.dbf' ...

  10. 函数的光滑化或正则化 卷积 应用 两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积

    http://graphics.stanford.edu/courses/cs178/applets/convolution.html Convolution is an operation on t ...