1
zoj3774 Power of Fibonacci
zoj3774 参考题解
比赛的时候看到了这个题目 然后改了下公式但是 t 了
化公式(具体看上面链接
因为k比较小就可以枚举
对于每一个k 公式可以化成等比求和
2
优化
预处理阶层和阶层逆元
欧拉降幂
另外的知识点
逆元线性递推公式
洛谷板子 P3811 洛谷题解挺清楚的
二次剩余定理
斐波那契通项公式
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll mod=1e9+9;
const ll A=691504013;
const ll invA=691504012;
const ll B=308495997;
const ll D=276601605;
ll fac[maxn];
ll invfac[maxn];
ll invn[maxn];
int init(){
int len=(int)(1e5+5);
fac[0]=fac[1]=invfac[0]=invfac[1]=invn[0]=invn[1]=1;
for(int i=2;i<=len;++i){
fac[i]=fac[i-1]*i%mod;
invn[i]=(mod-mod/i)*invn[mod%i]%mod;
invfac[i]=invfac[i-1]*invn[i]%mod;
}
}
ll C(ll n,ll m){
if(n>m) return 0;
if(n<0 || m<0) return 0;
ll res=fac[m];
res=res*invfac[m-n]%mod;
res=res*invfac[n]%mod;
return res;
}
ll qpow(ll x,ll n){
ll res=1;
x=x%mod;
n=n%(mod-1);
if(n==0) return 1;
while(n){
if(n&1) res=res*x%mod;
x=x*x%mod;
n=n/2;
}
return res;
}
int main(){
//freopen("std.in","r",stdin);
// freopen("std.out","w",stdout);
ll T;
scanf("%lld",&T);
init();
while(T--){
ll n,c,k;
scanf("%lld%lld%lld",&n,&c,&k);
ll q1=qpow(qpow(A,k),c);
ll Q=qpow(B*invA,c);
ll ans=0;
for(int i=0;i<=k;++i){
ll res=C(i,k);
if(i&1) res=mod-res;
if(q1==1){
ll n1=n%mod;
res=res*n1%mod;
}
else{
res=res*(q1*((qpow(q1,n)-1+mod)%mod)%mod)%mod;
res=(res*qpow(((q1-1+mod)%mod),mod-2))%mod;
}
q1=q1*Q%mod;
ans=(ans+res)%mod;
}
ans=ans*qpow(D,k)%mod;
printf("%lld\n",ans);
}
}