zoukankan      html  css  js  c++  java
  • 51nod1236 序列求和 V3

    这题炒鸡简单,只要第一步想对了后面顺风顺水QWQ(然鹅我没想到)

    前置芝士:

    1. 斐波那契数列通项公式

    2. 等比数列求和公式

    3. 二项式定理

    这题要求的就是 (sum_{i=1}^n Fib(i)^k) ,其中 Fib 就是斐波那契数列

    如果说没有 k 的话怎么做?仍然不会.jpg

    于是我们直接想带 k 的答案吧...

    我们考虑 把斐波那契数列的通项公式带进去

    然后鬼都知道怎么做了,就是一堆化式子:

    [egin{aligned}ANS=& sum_{i=1}^n Fib(i)^k\=& sum_{i=1}^{n} Big({ {(1+sqrt 5 )^iover2 } -{(1-sqrt 5)^i over 2} over sqrt 5} Big)^k \=& ig({1over sqrt 5}ig)^k sum_{i=1}^{n}sum_{j=0}^k (-1)^{k-j} egin{pmatrix} k\j end{pmatrix}Big( {1+sqrt 5 over2 }Big)^{ij} Big( {1-sqrt 5 over2 }Big)^{i(k-j)} \=& ig({1over sqrt 5}ig)^ksum_{j=0}^k (-1)^{k-j} egin{pmatrix} k\j end{pmatrix} sum_{i=1}^{n} Big( ig( {1+sqrt 5 over2 }ig)^j ig( {1-sqrt 5 over2 }ig)^{k-j} Big)^i end{aligned} ]

    注意公式后面的部分可套等比数列公式,然后 快速模 求解...

    于是我们只要预处理一下阶乘 以及 (({1+sqrt 5over 2})^i)(({1-sqrt 5over 2})^i) ,就可以 (O(k)) 时间内线性求解了,并且总复杂度也是 (O(k)) (当然,不算快速幂的话 XD)

    code

    不知道打的什么鬼东西巨丑无比...

    //by Judge
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define Rg register
    #define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
    #define ll long long
    using namespace std;
    const int s5=383008016;
    const int mod=1e9+9;
    const int M=1e5+3;
    typedef int arr[M];
    #ifndef Judge
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    #endif
    char buf[1<<21],*p1=buf,*p2=buf;
    inline int MO(ll x){return x-x/mod*mod;}
    inline int mul(int x,int y){return MO(1ll*x*y);}
    inline int dec(int x,int y){return x<y?x-y+mod:x-y;}
    inline int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
    inline ll read(){ ll x=0,f=1; char c=getchar();
    	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    	for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
    } char sr[1<<21],z[20];int CCF=-1,Z;
    inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
    inline void print(int x,char chr='
    '){
        if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
        while(z[++Z]=x%10+48,x/=10);
        while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
    } ll n; int k,t,MX=1e5,tmp,ans,inv[1000003]; arr fac,ifac,v1,v2;
    inline void prep(Rg int n){
    	v1[0]=v2[0]=fac[0]=fac[1]=inv[0]=inv[1]=ifac[0]=ifac[1]=1;
    	fp(i,2,n) inv[i]=mul(mod-mod/i,inv[mod%i]);
    	fp(i,2,n) fac[i]=mul(fac[i-1],i),ifac[i]=mul(ifac[i-1],inv[i]);
    	v1[1]=mul(s5+1,inv[2]),v2[1]=mul(mod+1-s5,inv[2]);
    	fp(i,2,n) v1[i]=mul(v1[i-1],v1[1]),v2[i]=mul(v2[i-1],v2[1]);
    	fp(i,n+1,MX=5e5) inv[i]=mul(mod-mod/i,inv[mod%i]);
    }
    inline int qpow(int x,ll p=mod-2,int s=1){
    	for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
    }
    inline int Inv(int x){return x<=MX?inv[x]:mul(mod-mod/x,Inv(mod%x));}
    inline int C(int n,int m){return mul(fac[n],mul(ifac[m],ifac[n-m]));}
    int main(){ prep(MX); int T=read(); ll t,tmp,ans,n,k;
    	for(;T;--T){ n=read(),k=read(),ans=0;
    		fp(j,0,k){ t=mul(v1[j],v2[k-j]),
    			tmp=t==1?n%mod:mul(dec(qpow(t,n+1),t),Inv(t-1));
    			tmp=mul(tmp,C(k,j)),ans=(k^j)&1?dec(ans,tmp):inc(ans,tmp);
    		} print(mul(ans,qpow(s5,(1ll*k*(mod-2)%(mod-1)+mod-1))));
    	} return Ot(),0;
    }
    
  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/Judge/p/10731573.html
Copyright © 2011-2022 走看看