杭电第一场1005题解
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+9;
const ll N=1e5+5;
ll A=691504013ll;//1+sqrt(5)/2
ll B=308495997ll;//1-sqrt(5)/2
ll D=276601605ll;//1/sqrt(5)
ll f[N],ivf[N];
inline ll pow(ll a,ll b)
{
b%=mod-1;
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1ll;
}
return res;
}
inline void init()
{
f[1]=1ll;f[0]=1ll;
for(ll i=2;i<=N-5;i++) f[i]=f[i-1]*i%mod;//阶层表
for(ll i=0;i<=N-5;i++)
{
ivf[i]=pow(f[i],mod-2);
}
}
int main()
{
int T;
ll n,c,k;
init();
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&c,&k);
ll ans=0;
A=691504013ll; B=308495997ll;
A=pow(A,c);B=pow(B,c);
// cout<<A<<' '<<B<<endl;
ll lvB=pow(B,mod-2);
ll a=1,b=pow(B,k);
for(ll i=0;i<=k;i++)
{
ll x=a*b%mod;
if(x==1)
{
x=(n+1)%mod;
}
else
{
x=(pow(x,n+1)-1+mod)%mod*pow((x-1+mod)%mod,mod-2)%mod;
}
if((k-i)&1) x=(x==0?x:mod-x);
ans=(ans+f[k]*ivf[i]%mod*ivf[k-i]%mod*x%mod)%mod;
a=a*A%mod;
b=b*lvB%mod;
}
ans=ans*pow(D,k)%mod;
printf("%lld\n",ans);
}
return 0;
}
/*
2
5 1 1
2 1 2
*/lpt的小屋 文章被收录于专栏
我想要一份甜甜的爱情

查看1道真题和解析