51nod 演算法馬拉松6 索函式 (規律題目)

2021-07-05 11:55:03 字數 1508 閱讀 1722

總的來說是要先找規律的題目,然後就是乙個球log2(f[ n ])的技巧。

這題目的解題報告說的很詳細:

通過列出前幾項觀察可以發現,答案其實是2^k-1,其中k為fib[n]在二進位制表示中的位數,記為bit(f[n])。

下面來證明該結論。用數學歸納法。

對於m=0,1時該結論顯然成立。設當m當m=n時,

由於f[n]=f[n-1]+f[n-2]那麼這個時候bit[f[n]]要麼等於bit(f[n-1])要麼等於bit(f[n-1])+1。

當bit(f[n])==bit(f[n-1])時,sor(n)=sor(n-1)=2^(bit(f[n-1]))-1,結論成立。

當bit(f[n])==bit(f[n-1])+1時,sor(n)=sor(n-1)*2+1=2^(bit(f[n-1])+1)-1=2^(bit(f[n]))-1,結論成立。

所以原結論成立。

由於n比較大,直接計算位數出不來。可以通過取對數來解決。

由斐波那切的通項公式f[n]=(((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n)/sqrt(5)= (((1+sqrt(5))/2)^n/sqrt(5))*(1-((1-sqrt(5))/(1+sqrt5))^n)

f[n]在二進位制下的位數是(int)log2((((1+sqrt(5))/2)^n/sqrt(5))*(1-((1-sqrt(5))/(1+sqrt5))^n))+1

當n比較的時候直接暴力計算出位數即可。

當n比較大的時候由於(1-((1-sqrt(5))/(1+sqrt5))^n))=1

那麼計算(int)log2((((1+sqrt(5))/2)^n/sqrt(5))+1這個即可。

把n提前面來就可以o(1)計算,(int)(n*log2((1+sqrt(5)) /2)- log2(sqrt(5)))+1

最後用快速冪取餘計算出結果。

#include #include #include #include #include #include #include using namespace std;

#define rep1(i,x,y) for(int i=x;i<=y;i++)

typedef long long ll;

typedef unsigned long long llu;

const ll base = (ll)1e17;

const int n = 1e5 + 100;

const int mod = 1e9 + 7;

const ll tbase = base%mod;

int bit_(llu n)

llu f[n],d[n],lim = 83 , yu[n];

void init()

}}ll n;

ll pow_(ll a, ll b)

return ans;

}inline ll read(ll& n)

int main()

}return 0;

}

51nod演算法馬拉松32

比賽鏈結 馬拉松是真的難 應該是我太菜了tnt 同bzoj1534 題解戳這裡 n個有標號的點,其中m個是葉子節點。問有多少數的形態。include include include include include using namespace std typedef long long ll co...

51nod演算法馬拉松15

智力徹底沒有了。看來再也拿不到獎金了qaq。a b君的遊戲 因為資料是9b1l,所以我們可以hash試一下資料。include include include include define rep i,s,t for int i s i t i define dwn i,s,t for int i ...

51nod演算法馬拉松13

a 取餘最長路 不難發現路徑可以拆成三條線段,只要知道兩個轉折點的位置就能計算出答案。設sum i,l,r 表示第i行從l到r元素的和,則答案可以表示為sum 1,1,x sum 2,x,y sum 3,y,n p。字首和一下轉化成 s3 n s3 y 1 s2 y s1 x s2 x 1 p,從小...