一開始想的是用矩陣來求,但發現樣例一直過不去。最後才發現,\((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...