欧拉降幂 ---- 2020 杭电多校[E - Fibonacci Sum]+欧拉降幂+和式的调整+二次剩余+毒瘤卡常

在这里插入图片描述


解题思路:
首 先 你 得 知 道 斐 波 那 契 的 通 项 式 子 : 首先你得知道斐波那契的通项式子:
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)=5 1[(21+5 )n(215 )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=215 ,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(anbn)
∑ 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(ic)k=(p1)ki=0n(aicbic)k
我 们 看 一 下 : ( a i ∗ c − b i ∗ c ) k 我们看一下:(a^{i*c}-b^{i*c})^k (aicbic)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.Ck0aic(k0)((b)ic)0+Ck1aic(k1)((b)ic)1+...+Ckkaic(kk)((b)ic)k=r=0kCkraic(kr)(b)icr
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(ic)k=(p1)ki=0nr=0kCkraic(kr)((b)ic)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)ki=0nr=0kCkr(1)raic(kr)bicr
进 行 和 式 调 整 进行和式调整
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)kr=0kCkr(1)ri=0naic(kr)bicr
令 t = a k − r b r 令t=a^{k-r}b^r t=akrbr
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)kr=0kCkr(1)ri=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(binv(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值