解题思路:
首
先
你
得
知
道
斐
波
那
契
的
通
项
式
子
:
首先你得知道斐波那契的通项式子:
首先你得知道斐波那契的通项式子:
F
(
n
)
=
1
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
F(n) = {1\over\sqrt5}[({1+\sqrt5\over2})^n-({1-\sqrt5\over2})^n]
F(n)=51[(21+5)n−(21−5)n]
令
a
=
1
+
5
2
,
b
=
1
−
5
2
,
p
=
5
令a={1+\sqrt5\over2},b={1-\sqrt5\over2},p=\sqrt5
令a=21+5,b=21−5,p=5
这些是mod(1e9+9)下的逆元
那么
F
(
n
)
=
1
p
(
a
n
−
b
n
)
F(n)={1\over p}(a^n-b^n)
F(n)=p1(an−bn)
∑
i
=
0
n
F
(
i
∗
c
)
k
=
(
1
p
)
k
∑
i
=
0
n
(
a
i
∗
c
−
b
i
∗
c
)
k
\sum_{i=0}^{n}F(i*c)^k=({1\over p})^k\sum_{i=0}^{n}(a^{i*c}-b^{i*c})^k
∑i=0nF(i∗c)k=(p1)k∑i=0n(ai∗c−bi∗c)k
我
们
看
一
下
:
(
a
i
∗
c
−
b
i
∗
c
)
k
我们看一下:(a^{i*c}-b^{i*c})^k
我们看一下:(ai∗c−bi∗c)k
进
行
多
项
式
展
开
:
进行多项式展开:
进行多项式展开:
1.
C
k
0
a
i
∗
c
∗
(
k
−
0
)
(
(
−
b
)
i
∗
c
)
0
+
C
k
1
a
i
∗
c
∗
(
k
−
1
)
(
(
−
b
)
i
∗
c
)
1
+
.
.
.
+
C
k
k
a
i
∗
c
∗
(
k
−
k
)
(
(
−
b
)
i
∗
c
)
k
=
∑
r
=
0
k
C
k
r
a
i
∗
c
∗
(
k
−
r
)
(
−
b
)
i
∗
c
∗
r
1.C_k^0a^{i*c*(k-0)}((-b)^{i*c})^0+C_k^1a^{i*c*(k-1)}((-b)^{i*c})^1+...+C_k^ka^{i*c*(k-k)}((-b)^{i*c})^k=\sum_{r=0}^kC_k^ra^{i*c*(k-r)}(-b)^{i*c*r}
1.Ck0ai∗c∗(k−0)((−b)i∗c)0+Ck1ai∗c∗(k−1)((−b)i∗c)1+...+Ckkai∗c∗(k−k)((−b)i∗c)k=∑r=0kCkrai∗c∗(k−r)(−b)i∗c∗r
2.
∑
i
=
0
n
F
(
i
∗
c
)
k
=
(
1
p
)
k
∑
i
=
0
n
∑
r
=
0
k
C
k
r
a
i
∗
c
∗
(
k
−
r
)
(
(
−
b
)
i
∗
c
)
r
2.\sum_{i=0}^{n}F(i*c)^k=({1\over p})^k\sum_{i=0}^{n}\sum_{r=0}^kC_k^ra^{i*c*(k-r)}((-b)^{i*c})^r
2.∑i=0nF(i∗c)k=(p1)k∑i=0n∑r=0kCkrai∗c∗(k−r)((−b)i∗c)r
3.
(
1
p
)
k
∑
i
=
0
n
∑
r
=
0
k
C
k
r
(
−
1
)
r
a
i
∗
c
∗
(
k
−
r
)
b
i
∗
c
∗
r
3.({1\over p})^k\sum_{i=0}^{n}\sum_{r=0}^kC_k^r(-1)^ra^{i*c*(k-r)}b^{i*c*r}
3.(p1)k∑i=0n∑r=0kCkr(−1)rai∗c∗(k−r)bi∗c∗r
进
行
和
式
调
整
进行和式调整
进行和式调整
4.
(
1
p
)
k
∑
r
=
0
k
C
k
r
(
−
1
)
r
∑
i
=
0
n
a
i
∗
c
∗
(
k
−
r
)
b
i
∗
c
∗
r
4.({1\over p})^k\sum_{r=0}^kC_k^r(-1)^r\sum_{i=0}^{n}a^{i*c*(k-r)}b^{i*c*r}
4.(p1)k∑r=0kCkr(−1)r∑i=0nai∗c∗(k−r)bi∗c∗r
令
t
=
a
k
−
r
b
r
令t=a^{k-r}b^r
令t=ak−rbr
5.
(
1
p
)
k
∑
r
=
0
k
C
k
r
(
−
1
)
r
∑
i
=
0
n
(
t
c
)
i
5.({1\over p})^k\sum_{r=0}^kC_k^r(-1)^r\sum_{i=0}^{n}(t^c)^i
5.(p1)k∑r=0kCkr(−1)r∑i=0n(tc)i
这道题卡常数:1.我们要预处理所有的阶乘
2.对于
t
c
t^c
tc的求法我们要用递推的形式
t
1
=
t
0
∗
(
b
∗
i
n
v
(
a
)
)
c
t_1=t_0*(b*inv(a))^c
t1=t0∗(b∗inv(a))c
3.对于
n
,
c
∈
[
1
,
1
e
18
]
我
们
要
运
用
欧
拉
降
幂
的
方
法
n,c\in[1,1e18]我们要运用欧拉降幂的方法
n,c∈[1,1e18]我们要运用欧拉降幂的方法
#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 2e5+10, mod = 1e9 + 9;
const long double eps = 1e-5;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{
x = 0;char ch = getchar();ll f = 1;
while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{
read(first);
read(args...);
}
const ll A = 691504013;//斐波那契通项公式的a
const ll B = 308495997;//斐波那契数列通项的b
const ll INVMOD = 1e9 + 8;//mod的逆元
const ll INV2 = 5e8 + 5;//2%(mod)的逆元
const ll INV5 = 383008016;//5的逆元
const ll I5=276601605;
int T;
ll n, c, k;
ll fac[N], fac_inv[N];
ll pa[N], pb[N];
inline ll qmi(ll a, ll b)
{
ll res = 1;
while(b)
{
if(b & 1) res = (res * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return res % mod;
}
inline void Pre(int n)
{
fac[0] = 1;
for(int i = 1; i <= n; ++ i) fac[i] = i * fac[i - 1] % mod;
fac_inv[0] = fac_inv[1] = 1;
for(int i = 2; i <= n; ++ i) fac_inv[i] = qmi(fac[i],mod-2) % mod;
pa[0]=1; for (int i = 1; i <= n; i++) pa[i] = pa[i-1] * A % mod;
pb[0]=1; for (int i = 1; i <= n; i++) pb[i] = pb[i-1] * B % mod;
}
inline ll C(int n,int m){
return fac[n]*fac_inv[m]%mod*fac_inv[n-m]%mod;
}
inline ll Inv(ll x){
return qmi(x,mod-2);
}
inline void Slove()
{
ll ans = 0;
ll tui = qmi(B * qmi(A,mod - 2) % mod,c);//递推求t
ll t = qmi(pa[k] % mod ,c) % mod;
for(int i = 0; i <= k; ++ i)
{
ll tmp = (t == 1) ? n % mod : t*(qmi(t,n % INVMOD + INVMOD)-1+mod)%mod*Inv(t-1) % mod;
if(i & 1)
ans-=C(k,i)*tmp%mod;
else ans+=C(k,i)*tmp%mod;//预处理了组合数
if(ans < 0) ans = (ans + mod) % mod;
else ans %= mod;
t = t * tui % mod;
}
ans = ans * qmi(I5,k) % mod;
cout << ans % mod << endl;
}
int main()
{
Pre(100001);
read(T);
while(T --)
{
read(n,c,k);
c < INVMOD ? c = c : c = c % INVMOD + INVMOD;//欧拉降幂
Slove();
}
return 0;
}