zoukankan      html  css  js  c++  java
  • 洛谷P5591 小猪佩奇学数学

    [largeegin{aligned} &sum_{i=0}^ninom{n}{i}p^ileft lfloor frac{i}{k} ight floor \ =&sum_{i=0}^ninom{n}{i}p^i frac{i-i mod k}{k} \ =&frac{1}{k}left ( sum_{i=0}^ninom{n}{i}p^i i-sum_{i=0}^ninom{n}{i}p^i (i mod k) ight ) \ end{aligned} ]

    先化简前一项:

    [largeegin{aligned} &sum_{i=0}^ninom{n}{i}p^i i \ =&nsum_{i=0}^ninom{n-1}{i-1}p^i \ =&nsum_{i=0}^{n-1}inom{n-1}{i}p^{i+1} \ =&np(p+1)^{n-1} end{aligned} ]

    再化简后一项:

    [largeegin{aligned} &sum_{i=0}^ninom{n}{i}p^i (i mod k) \ =&sum_{d=0}^{k-1}dsum_{i=0}^ninom{n}{i}p^i [k mid i-d] \ =&sum_{d=0}^{k-1}dsum_{i=0}^ninom{n}{i}p^i frac{1}{k}sum_{j=0}^{k-1} omega_k^{ij-dj}\ =&frac{1}{k}sum_{j=0}^{k-1}sum_{i=0}^ninom{n}{i}(p omega_k^j)^isum_{d=0}^{k-1}domega_k^{-dj}\ =&frac{1}{k}sum_{j=0}^{k-1}(p omega_k^j+1)^nsum_{d=0}^{k-1}domega_k^{-dj}\ end{aligned} ]

    发现后一项式子形如 (sumlimits_{i=0}^{n-1}ix^i),应用扰动法得:

    [largeegin{aligned} S=&sum_{i=0}^{n-1}ix^i \ =&sum_{i=0}^{n-1}(i+1)x^{i+1}-nx^n \ =&xsum_{i=0}^{n-1}ix^i+sum_{i=0}^{n-1}x^{i+1}-nx^n \ S=&xS+xfrac{1-x^n}{1-x}-nx^n \ =&frac{xfrac{1-x^n}{1-x}-nx^n}{1-x} end{aligned} ]

    代入得:

    [largeegin{aligned} &frac{1}{k}sum_{j=0}^{k-1}(p omega_k^j+1)^nsum_{d=0}^{k-1}domega_k^{-dj}\ =&frac{1}{k}left(sum_{j=1}^{k-1}(p omega_k^j+1)^nfrac{k}{omega_k^{-j}-1}+(p+1)^nfrac{k(k-1)}{2} ight)\ end{aligned} ]

    然后就能快速计算了。

    #include<bits/stdc++.h>
    #define maxn 4000010
    #define p 998244353
    #define g 3
    using namespace std;
    typedef long long ll;
    template<typename T> inline void read(T &x)
    {
        x=0;char c=getchar();bool flag=false;
        while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
        while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
        if(flag)x=-x;
    }
    ll n,x,k,w,wn,val;
    ll qp(ll x,ll y)
    {
        ll v=1;
        while(y)
        {
            if(y&1) v=v*x%p;
            x=x*x%p,y>>=1;
        }
        return v;
    }
    int main()
    {
        read(n),read(x),read(k),w=1,wn=qp(g,(p-1)/k);
        for(int i=0;i<k;++i)
        {
            ll v=qp(x*w%p+1,n);
            if(i) val=(val+v*k%p*qp((qp(w,p-2)-1+p)%p,p-2)%p)%p;
            else val=(val+v*(((k-1)*k/2)%p)%p)%p;
            w=w*wn%p;
        }
        printf("%lld",(n*x%p*qp(x+1,n-1)%p-val*qp(k,p-2)%p+p)%p*qp(k,p-2)%p);
        return 0;
    }
    
  • 相关阅读:
    团队贡献分汇总
    【Gamma】Scrum Meeting 1
    【Beta】测试报告
    【Beta】发布说明
    【技术博客】JWT的认证机制Django项目中应用
    Daily Scrumming* 2015.12.17(Day 9)
    Daily Scrumming* 2015.12.16(Day 8)
    Daily Scrumming* 2015.12.15(Day 7)
    Daily Scrumming* 2015.12.13(Day 5)
    Daily Scrumming* 2015.12.12(Day 4)
  • 原文地址:https://www.cnblogs.com/lhm-/p/14203937.html
Copyright © 2011-2022 走看看