杭电第一场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的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

06-22 10:41
赣东学院 Java
程序员小白条:?周六晚上投,这是什么操作,专门找996起步的吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务