1. 程式人生 > >BZOJ4277:萃香的請柬——題解

BZOJ4277:萃香的請柬——題解

成了 include 時間 https 一秒 有一個 不難 inline mat

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/+

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

BZOJ4277:萃香的請柬——題解