• 【洛谷5517】[MtOI2019] 幻想乡数学竞赛(数学)


    点此看题面

    • 已知(a_0=-3,a_1=-6,a_2=-12),且(a_n=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n(nge 2)),求(a_n)的值。
    • 数据组数(le5 imes10^7)(nle2^{64}-1)

    递推式变形

    观察系数,发现刚好(a_n)(a_{n-2})系数相反,(a_{n-1})(a_{n-3})系数相反,因此容易想到移项得到:

    [a_n-a_{n-2}=3(a_{n-1}-a_{n-3})+3^n ]

    (b_n=a_n-a_{n-2}),也就是说:

    [b_n=3b_{n-1}+3^n ]

    然后发现这个(3)也大有玄机,我们给式子两侧同除以(3^n)得到:

    [frac{b_n}{3^n}=frac{b_{n-1}}{3^{n-1}}+1 ]

    (c_n=frac{b_n}{3^n}),也就是说:

    [c_n=c_{n-1}+1 ]

    代入几个初值,有(c_0=-3,c_1=-2,c_2=-1),由此可以直接得出:

    [c_n=n-3 ]

    (b_n=(n-3) imes 3^n),现在的问题就是通过(b)来还原(a)了。

    通项公式的推导

    首先列出式子:

    [a_n=sum_{0le ile n,iequiv n(mod 2)}(i-3) imes3^i ]

    先考虑(n)为偶数的情况,直接枚举新的(frac{i'}2)

    [a_n=sum_{i=0}^{frac n2}(2i-3) imes9^{i}=2sum_{i=0}^{frac n2}i imes 9^i-3sum_{i=0}^{frac n2}9^i ]

    后面的(sum_{i=0}^{frac n2}9^i)可以直接利用等比数列求和公式计算,等于(frac{9^{frac n2+1}-1}8)

    至于前面那项,设(f(m)=sum_{i=0}^mi imes 9^i),有一个经典的转化套路:

    [egin{aligned} f(m)&=sum_{i=1}^msum_{j=i}^m9^i\ &=sum_{i=1}^mfrac{9^{m+1}-9^i}{8}\ &=frac{m imes9^{m+1}}8-frac{9^{m+1}-9}{64}\ &=frac{(8m-1)9^{m+1}+9}{64} end{aligned} ]

    最后总结一下,根据奇偶性列出(a_n)的两种通项公式:

    [a_n= egin{cases} 2f(frac n2)-frac38 imes(9^{frac n2+1}-1)&(n is exttt{even})\ 6f(frac {n-1}2)-frac34 imes(9^{frac {n-1}2+1}-1)&(n is exttt{odd}) end{cases} ]

    虽然式子中有很多幂,但它们都是以(9)为底的,可以预处理一下实现光速幂。

    代码:(O(T))

    #include<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Rg register
    #define RI Rg int
    #define Cn const
    #define CI Cn int&
    #define I inline
    #define W while
    #define S 32768
    #define X 1000000007
    #define ull unsigned long long
    using namespace std;
    Cn int I2=500000004,I4=1LL*I2*I2%X,I8=1LL*I2*I4%X,I64=1LL*I8*I8%X;
    ull n;int p[S+5],pp[S+5];I int P9(ull y) {return y%=X-1,1LL*pp[y/S]*p[y%S]%X;}//求9^y
    namespace Generator
    {
    	ull sd;int op;I void GetSeed() {scanf("%llu%d",&sd,&op);}
    	I ull Rand() {return sd^=sd<<43,sd^=sd>>29,sd^=sd<<34,sd;}
    	I ull R() {return op?(op==1?Rand()%UINT_MAX+1:Rand()):Rand()%USHRT_MAX+1;}
    }using namespace Generator;
    I int F(Cn ull& m) {return ((8LL*(m%X)-1+X)*P9(m+1)+9)%X*I64%X;}//计算∑i*(9^i)
    int main()
    {
    	RI i;for(p[0]=i=1;i<=S;++i) p[i]=9LL*p[i-1]%X;for(pp[0]=i=1;i<=S;++i) pp[i]=1LL*pp[i-1]*p[S]%X;//预处理实现光速幂
    	RI Tt,t=0;scanf("%d",&Tt),GetSeed();W(Tt--) n=R(),
    		t^=n&1?(6LL*F(n-1>>1)-3LL*I4*(P9((n-1>>1)+1)-1)%X+X)%X:(2LL*F(n>>1)-3LL*I8*(P9((n>>1)+1)-1)%X+X)%X;//分奇偶性计算
    	return printf("%d
    ",t),0;
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    线性反馈系统
    静磁场
    平面波的传播
    Partition does not end on cylinder boundary
    FFTW简介及使用
    EINTR、ERESTARTSYS和SIGINT
    凉面
    linux Shell编程
    Linux From Scratch [2]
    Linux From Scratch [1]
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5517.html
Copyright © 2020-2023  润新知