BZOJ4277:萃香的请柬——题解

https://www.luogu.org/problemnew/show/P4277

萃香在小时候就一直有一个梦想,就是邀请全乡居民一起参加宴会,在上次发动异变被灵梦退治之后她仍旧没有放弃,而是在元宵节前早早准备好了难以计数的请柬。

现在,宴会即将开始,萃香却还是有一大堆请柬没有送出。经过大数学家琪露诺的严谨推算,到2018年时幻想乡的居民数目已经远远超过了外界,而这就使得宴会的邀请变得极为困难。

但是,拥有"操纵密度程度的能力"的萃香可以分成大大小小的萃香一起去送请柬。由于小萃香的移动速度过慢,因此她决定只让大萃香曲去送请柬。

开始时有S只萃香,之后每过一秒每一个大萃香会分成一大一小两个萃香,与此同时上一次分出的小萃香会积聚能量变大为大萃香。

(图片见原题)

(很容易看出,第一次的大萃香经过一秒后分成了一大一小两只萃香,之后一秒刚才分出的大萃香继续分裂,而刚才的小萃香长大为大萃香)

可是,我们这位"小小的百鬼夜行"发现了一个严重的问题:在经过无限长的时间后,萃香的数目太多了。于是她决定每一次只让一段区间内的大萃香去送请柬,而她现在想要知道每一次能够送出的请柬个数。

如果你能帮她完成这个任务,她就会送给你两个奖励——100分和宴会的请柬!

一次比赛切的题,并不知道为什么洛谷评级为提高+,不过因为早上就做了这一道题所以姑且来写个题解证明上午我没偷懒(滑稽。

这题给人感觉很像CF柯朵莉专场的A题。

首先思考给出来的字符串是没有用的,原因有两个:

1.因为时间是无限制的,所以后面所变出来的萃香永远挤不到前面,所以只和第一个字符有关。

2.因为L肯定会变成B,所以第一个字符无所谓。

综上,我们固定最开始只有一个B。

开始解题,设dp(i)表示1~i的B的个数。答案为dp(r)-dp(l-1)。(这里一定要注意,l可以为0(当时被坑了半个小时debug直到答疑帖有人问了位置……批斗一发出题人))

设f[i]为过i秒后的序列长度,打表容易发现f[i]=f[i-1]+f[i-2],这就是一个fib。(实际就是i-1的状态和i-2的状态拼接到一起成了i状态)

设g[i]为过i秒后的序列B个数,有上面不难得出g[i]=g[i-1]+g[i-2],也是个fib(注意两者的初值不一样)。

所以我们可以递归地处理dp(i,j)(多加入的j表示当前为第几秒),处理出来i最小应该属于第lev的区间,则有如下讨论:

1.i<f[lev-1],答案为dp(i,lev-1);

2.i=f[lev-1],答案为g[lev-1];

3.i>f[lev-1],答案为g[lev-1]+dp(i-f[lev-1],lev-2);

硬算即可,注意f可能爆longlong,对于第92个f特判即可。

(咦我感觉我比出题人说的简单耶)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<map>
using namespace std;
typedef long long ll;
const int S=1e6+3;
char s[S];
ll f[101];
ll suan(int lev,ll r){
    if(r<=0)return 0;
    if(lev==0)return 0;
    if(lev==1)return 1;
    if(r>f[lev-1])return f[lev-2]+suan(lev-2,r-f[lev-1]);
    else if(f[lev-1]==r)return f[lev-2];
    else return suan(lev-1,r);
}
inline void init(){
    f[0]=1;f[1]=1;
    for(int i=2;i<=91;i++)f[i]=f[i-1]+f[i-2];
    cin>>s;
}
int main(){
    init();
    int n;ll l,r;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    scanf("%lld%lld",&l,&r);
    if(l>r)swap(l,r);
    printf("%lld\n",suan(92,r)-suan(92,l-1));
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

原文地址:https://www.cnblogs.com/luyouqi233/p/8541548.html

时间: 2024-11-10 18:55:08

BZOJ4277:萃香的请柬——题解的相关文章

[luogu P3786]萃香抱西瓜 [spfa][状态压缩]

题目背景 伊吹萃香(Ibuki Suika)正在魔法之森漫步,突然,许多西瓜(Suika)从四周飞来,划出了绚丽的轨迹.虽然阵势有点恐怖,但她还是决定抱走一些西瓜. 题目描述 萃香所处的环境被简化为一个长为h,宽为w的网格平面.X坐标范围为[1,w],y坐标范围为[1,h]. 她初始(第1个时刻)站在坐标为sx,sy的方格. 西瓜可能在任意一个方格出现,在每个时间单位,它们可能向任何一个方向移动,也可能静止不动.西瓜的位置和移动的轨迹是已知的.西瓜的总数为n个,但只有m个西瓜可以被萃香抱走,因为

Luogu P1342 请柬 题解

差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看成从起点出发,逆着每个点过来的路去找一次每个点?所以只需要存边的时候处理一下,然后直接跑Dijkstra就行了. 附上代码. #include<bits/stdc++.h> #define clean(a,i) memset(a,i,sizeof(a)) #define ll long long

P4231 三步必杀

P4231 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪们组成的小社会,一片其乐融融的景象. 诶,不远处突然出现了一些密密麻麻的小点,好像大颗粒扬尘一样. 离得近了点,终于看清楚了. 长着角的鬼们聚在一起,围观着另一只鬼的表演. 那”扬尘”,其实都是弹幕. 勇仪的招数之一,三步之内,所到之处弹幕云集,几乎没有生存可能. 为了强化这一技能,勇仪将对着一排柱

对于有关东方的题目的整理。。

东方赛高 此为总贴 收录以东方project为背景的题目. 1. luogu P3345 [ZJOI2015]幻想乡战略游戏 动态点分治(暴力水过) 2. luogu P3344 [ZJOI2015]幻想乡WIFI搭建计划 3. luogu P3343 [ZJOI2015]地震后的幻想乡 4. luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 5. luogu P3347 [ZJOI2015]醉熏熏的幻想乡 6. luogu P1726 上白泽慧音 求强连通分量, 输出最大强连通分量

洛谷p1732 活蹦乱跳的香穗子 二维DP

今天不BB了,直接帖原题吧  地址>>https://www.luogu.org/problem/show?pid=1732<< 题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值 跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳. 香穗子可以从任意的格子出发,在任意的格子结束, 那么她最多能跳几次? 输入输出格式 输入格式: 第一行n,m,

NOIP2017总结 &amp; 题解

day1t1的结论貌似在哪见过,自己稍微验证了一下貌似没记错就没有管了.t2一道很好(keng)的模拟题t3自己做题好慢啊,想出来dp打上去最后几分钟才过了大样例,我写的是记忆化搜索,判-1很好判,没时间加上去了可惜了,不过还是自己做题太慢了.然后由于没拍,不确定自己dp对不对,就特判了k=0粘了一个暴力,没想到暴力错了,70变成50...基础不扎实gg 100+100+50=250  好菜啊t3没A掉 day2t1看完题就开始打,没注意算距离时减一下就变成两倍了会爆long long,但好像数

csu-2018年11月月赛Round2-div2题解

csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0=<X<=20,1<=Y<=20,X=<Z<=50 Input 单组数据 x,y,z的数值 Output 过Z个月以后,共有成虫对

2019.11.11 题解报告

目录 2019.11.11 题解报告 答题情况: 各题目分析: 题目解析: 代码实现: 2019.11.11 题解报告 \[N^2\text{狂草1e5它不香嘛?}\] \[\text{By:Unluckierblock}\] 答题情况: 总成绩 : 169, 排名: 11 / 32 T1 : 0 T2 : 99 T3 : 70 各题目分析: 题目 1 : 预估成绩 : 60 实际成绩 : 0 考试用时 : 8 : 00 ~ 8 : 50 , 9 : 50 ~ 10 : 10 没有什么感觉 ,

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种