Fibonacci Sum 2020杭電多校1

2022-06-30 18:24:07 字數 1670 閱讀 3651

一開始想的是用矩陣來求,但發現樣例一直過不去。最後才發現,\((ab)^k \ne a^kb^k\),其中 \(a,b\) 為矩陣,做了怎麼久才發現是乙個假演算法。

看來題解才發現用的是斐波那契數列的通項公式:

\[f_n=\frac}[(\frac})^n-(\frac})^n]

\]同時還要知道:\(5\) 是 \(1e9+9\) 的二次剩餘

且有:\[383008016^2 \equiv 616991993^2 \equiv 5\ (mod\ 1e9+9)

\]由此可知,在模 \(1e9+9\) 的情況下,\(\sqrt\) 與 \(383008016\) 同餘。

可以求出 \(\sqrt\) 的逆元為 \(invsqrt5=276601605\)。

令 \(a=\frac},b=\frac}\),通過快速冪可以求得:\(a=691504013,b=308495997\)。

所以,有:

\[f_^=invsqrt5^k*[a^n-b^n]^k

\]而根據二項式展開,有:

\[(a^n-b^n)^k=c(k,0)*(a^n)^0*(b^n)^k+c(k,1)*(a^n)^*(b^n)^+...+c(k,k)*(a^n)^k*(b^n)^0

\]所以,

\[ans=invsqrt5^k*\sum_^^)^i(-b^)^}]}

\]又根據等比數列的求和公式:

\[s_i=\sum_^)^i(-b^)^}=\frac*b^)}*b^}*a^*(-1)^*b^

\]注意特判公比為 \(1\) 的情況,其中\(a^,b^,a^,b^\) 均可以預處理出來。

最終的答案為:

\[ans=invsqrt5^k*\sum_^

\]複雜度為:\(o(klogn)\),能預處理的都預處理,否則容易超時。

#include using namespace std;

typedef long long ll;

const int n=1e5+5;

const int mod=1e9+9;

const int phi=1e9+8;

ll c[n],fac[n],inv[n],sa[n],sb[n];

ll inv2=500000005,p=383008016,q=276601605;

ll power(ll a,ll b)

return res;

}void init()//預處理出階乘和階乘逆元

void getc(ll k)

int main()

ll up=(1-sb[i]+mod)%mod;

ll down=(1-sa[i]+mod)%mod;

down=power(down,mod-2);

ll tmp=up*down%mod;

tmp=(tmp*sa[i]%mod*f+mod)%mod;

tmp=tmp*c[i]%mod;

ans=(ans+tmp)%mod;

}ans=ans*power(q,k)%mod;

printf("%lld\n",ans);

}return 0;

}

2 02 理解查詢模型

示例 select name from users where age 10 可以形象的看作是下面這樣 let arr let users users.foreach item 是指列與列之間進行運算得出的結果,叫做廣義投影 因為null 表達的意思是 空 null null false null ...

CI20 2 洗牌演算法

實現乙個方法,對一副牌 52張 進行洗牌,要求洗出的52 組合是的等概率的,即每種組合的概率為1 52 假設已經有乙個完美的隨機數生成器。思路 思路比較直觀,第一次從52張牌中隨機取一張出來,概率為1 52 第二次從剩下的51張隨機取一張出來,概率為1 51 以此類推最終的概率就是1 52 接下來是...

axp202電源管理

問題 充電電流被限制,導致充電時間過長。版本分支 android4.3 master 復現問題,檢測電流變化,發現機器在深度休眠後電流會由原來的1.2a變成0.5a。猜測 可能是由於充電電流過小導致充電時間過長。echo 30 sys class axppower axpreg cat sys cl...