SHOI2015bzoj4591 超能粒子炮·改

來源:互聯網
上載者:User

根據lucas定理,我們有
ans(n,k)=ans(⌊np⌋,⌊kp⌋−1)∗∑i=0p−1(n%pi)+(⌊n/p⌋⌊k/p⌋)∑i=0k%p(n%pi) ans(n,k)=ans(\lfloor\frac n p \rfloor,\lfloor \frac k p\rfloor -1)*\sum_{i=0}^{p-1}\binom{n\%p}i+\binom{\lfloor n/p\rfloor}{\lfloor k/p\rfloor}\sum_{i=0}^{k\%p}\binom{n\%p}i
其中 ans ans項遞迴計算,組合數用lucas暴力算,和式 O(p2) O(p^2)預先處理。
複雜度 O(p2+Tlognlogp) O(p^2+T\log n\log p)。

#include<cstdio>#include<algorithm>using namespace std;#define LL long longconst int p=2333;int pow(int base,int k){    int ret=1;    for (;k;k>>=1,base=base*base%p)        if (k&1) ret=ret*base%p;    return ret;}int fac[p+10],inv[p+10],sum[p+10][p+10];int c(LL n,LL k){    if (k>n) return 0;    if (n<p&&k<p) return fac[n]*inv[k]%p*inv[n-k]%p;    return c(n%p,k%p)*c(n/p,k/p)%p;}int solve(LL n,LL k){    int ret=0,tem=0;    if (n<p&&k<p) return sum[n][k];    return (sum[n%p][p-1]*solve(n/p,k/p-1)%p+sum[n%p][k%p]*c(n/p,k/p)%p)%p;}int main(){    LL n,k;    inv[0]=fac[0]=1;    for (int i=1;i<p;i++) fac[i]=fac[i-1]*i%p;    inv[p-1]=pow(fac[p-1],p-2);    for (int i=p-2;i;i--) inv[i]=inv[i+1]*(i+1)%p;    for (int i=0;i<p;i++)    {        sum[i][0]=1;        for (int j=1;j<p;j++) sum[i][j]=(sum[i][j-1]+c(i,j))%p;    }    int T;    scanf("%d",&T);    while (T--)    {        scanf("%lld%lld",&n,&k);        printf("%d\n",solve(n,k));    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.