萃香的請柬
做法:本題需要用到找規律(劃掉)數學證明。
首先我們要猜(劃掉)觀察出兩個結論:
第一:若第乙個字串為l,第二個字串為b,則以後任意字串都是前乙個字串後面接上前乙個字串的前乙個字串,如第三個字串為b+l=bl,第四個為bl+b=blb。
第二:無限長時間後,序列和初始狀態無關。
第乙個結論的證明,我們用數學歸納法,對於前三個字串顯然滿足這個結論,而對於第
k k
個字串,若第k−
1' role="presentation" style="position: relative;">k−1
k−1個字串為第k−
2 k−2
和k−3 k−3
個字串拼接而成,那麼經過乙個單位時間後,第k−
2 k−2
個字串演變為第k−
1 k−1
個字串,第k−
3 k−3
個字串演變為第k−
2 k−2
個字串,因此第
k k
個字串就由第k−
1' role="presentation" style="position: relative;">k−1
k−1和
k−2 k−2
個字串拼接而成,得證。
而對於第二個結論,因為所有的過程都是像上面那樣不斷向後接,所以無限長的時間後序列的狀態肯定是一定的。
根據上面的結論,我們知道對於任意乙個字串,其一定包含該字串前面的每乙個字串,並且是作為字首(除了l)。又根據上面的結論,我們知道乙個這樣的字串的長度是乙個斐波那契數,其中所含的b的數量也是斐波那契數。因此,我們計算答案的時候,用區間[1
,r] [1,
r]
的答案減去[1
,l−1
] [1,
l−1]
的答案,而計算[1
,x] [1,
x]
的答案的方法就是對其進行斐波那契數拆分,即從大到小試驗斐波那契數,如果
x x
達到當前斐波那契數,則表示詢問的字首中包含乙個長度為當前斐波那契數的像上面形式的字串,那麼我們就累加答案,然後因為該字串後面一定也會接著比這個字串長度更小的字串,所以我們直接將
x' role="presentation" style="position: relative;">x
x減去當前的斐波那契數,繼續試驗即可。
據試驗,最大需要用到的斐波那契數為第
92 92
項(令第1,
2 1,2
項均為1 1
),所以總的時間複雜度應該是o(
92n)' role="presentation" style="position: relative;">o(92
n)o(
92n),可以通過此題。
以下是本人**:
#include
#define ll long long
using
namespace
std;
char s[1000010];
int n;
ll fib[110],l,r;
ll solve(ll x)
int main()
return
0;}
Luogu P1208 混合牛奶
這個題目直接開個結構體按 排序,然後一直加加加,就可以了。典型的貪心。include include include include include include using namespace std int i,m,n,j,k,ans struct mana 5001 bool cmp man...
luogu P1525 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...
luogu P2619 奶牛工資
原題位置 這道題是個貪心,怎麼說是貪心呢,就是先選大的,後考慮小的 千萬不要把上句話的意思理解歪了,一開始我就理解歪了,然後華麗麗地tle了 其實就是for,然後如果當前這個值可以被選,就選到不能再選這個值為止 還有乙個小技巧,就是我們定義乙個值,等於c,然後用這個值減,知道小於等於0,這樣子比一直...