• 数学题


    也许更好的阅读体验

    (mathcal{Description})

    (n,b,k),求
    (egin{aligned}sum_{i=1}^negin{pmatrix}i\k end{pmatrix}b^iend{aligned})

    答案对(998244353)取模

    (1leq kleq 500000,1leq nleq 10^{18},2leq bleq 998244353)

    (mathcal{Solution})


    (egin{aligned}f_{k}=sum ^{n}_{i=1}egin{pmatrix} i \ k end{pmatrix}b^{i}end{aligned})

    则有
    (egin{aligned}f_{k-1}=sum ^{n}_{i=1}egin{pmatrix} i \ k-1 end{pmatrix}b^{i}end{aligned})

    (egin{aligned}bf_{k}=sum ^{n+1}_{i=2}egin{pmatrix} i-1 \ k end{pmatrix}b^{i}end{aligned})

    (egin{aligned}bf_{k-1}=sum ^{n+1}_{i=2}egin{pmatrix} i-1 \ k-1 end{pmatrix}b^{i}end{aligned})

    (egin{aligned}bf_{k}+bf_{k-1}=sum ^{n+1}_{i=2}left(egin{pmatrix} i-1 \ k end{pmatrix}+egin{pmatrix} i-1 \ k-1 end{pmatrix} ight)b^{i}=sum ^{n+1}_{i=2}egin{pmatrix} i \ k end{pmatrix}b^{i}=f_k+egin{pmatrix}n+1\ kend{pmatrix}b^{n+1}-egin{pmatrix}1\kend{pmatrix}bend{aligned})

    移项得

    (left(b-1 ight)f_k=egin{pmatrix}n+1\kend{pmatrix}b^{n+1}-egin{pmatrix}1\kend{pmatrix}b-bf_{k-1})

    (f_k=dfrac{egin{pmatrix}n+1\kend{pmatrix}b^{n+1}-egin{pmatrix}1\kend{pmatrix}b-bf_{k-1}}{b-1})

    (k=0)时,要求的就是一个等比数列,我们用等比数列求和公式直接算就可以了

    (f_0=dfrac{b^{n+1}-b}{b-1})

    总复杂度(O(k))

    (mathcal{Code})

    /*******************************
    Author:Morning_Glory
    LANG:C++
    Created Time:2019年09月17日 星期二 10时54分50秒
    *******************************/
    #include <cstdio>
    #include <fstream>
    #define ll long long
    using namespace std;
    const int mod = 998244353;
    const int maxn = 500005;
    ll n,b,k,ans;
    ll invb,mi,C;
    ll inv[maxn];
    //{{{ksm
    ll ksm (ll a,ll b)
    {
    	a%=mod;
    	ll s=1;
    	for (;b;b>>=1,a=a*a%mod)
    		if (b&1)	s=s*a%mod;
    	return s;
    }
    //}}}
    int main()
    {
    	scanf("%lld%lld%lld",&n,&b,&k);
    	C=(n+1)%mod,inv[1]=1,invb=ksm(b-1,mod-2);
    	for (int i=2;i<=k;++i)	inv[i]=(-mod/i*inv[mod%i]%mod+mod)%mod;
    	ans=(ksm(b,n+1)-b+mod)%mod*invb%mod;
    	mi=ksm(b,n+1);
    	if (n<k){	printf("0
    ");return 0;}
    	if (n==k){	printf("%lld
    ",ksm(b,n));return 0;}
    	for (int i=1;i<=k;++i){
    		ll t=0;
    		if (i<=1)	t=b;
    		ans=((C*mi%mod-t-b*ans%mod)%mod+mod)%mod*invb%mod;
    		C=(n-i+1)%mod*C%mod*inv[i+1]%mod;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
    

    如有哪里讲得不是很明白或是有错误,欢迎指正
    如您喜欢的话不妨点个赞收藏一下吧

  • 相关阅读:
    九省联考2018 解题报告
    「PKUSC2018」最大前缀和(状压dp)
    「雅礼集训 2017 Day2」解题报告
    UVA10829 L-Gap Substrings(后缀数组+ST表)
    [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
    「雅礼集训 2017 Day1」 解题报告
    LeetCode 190. Reverse Bits (算32次即可)
    LeetCode 437. Path Sum III (STL map前缀和)
    LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
    LeetCode 1. Two Sum (c++ stl map)
  • 原文地址:https://www.cnblogs.com/Morning-Glory/p/11536917.html
Copyright © 2020-2023  润新知