zoukankan      html  css  js  c++  java
  • [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)

    大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算。

    于是问题变成求1~k的所有2333进制数上每一位数的组合数之积。

    数位DP,f[i][0/1]表示从高到低第i位,这一位没卡/卡了限制,的组合数之积,转移显然。

    WA 8发,都想抽死自己。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     4 typedef long long ll;
     5 using namespace std;
     6 
     7 const int N=3010,P=2333;
     8 int T,tot,tot2,C[N][N],S[N][N],a[N],b[N],f[N][2];
     9 ll n,k;
    10 
    11 int main(){
    12     freopen("bzoj4591.in","r",stdin);
    13     freopen("bzoj4591.out","w",stdout);
    14     C[0][0]=1; rep(i,0,P) S[0][i]=1;
    15     rep(i,1,P){
    16         C[i][0]=S[i][0]=1;
    17         rep(j,1,P) C[i][j]=(C[i-1][j-1]+C[i-1][j])%P,S[i][j]=(S[i][j-1]+C[i][j])%P;
    18     }
    19     for (scanf("%d",&T); T--; ){
    20         scanf("%lld%lld",&n,&k); tot=0;
    21         while (n) a[++tot]=n%P,n/=P;
    22         rep(i,1,tot) b[i]=k%P,k/=P;
    23         f[tot+1][0]=0; f[tot+1][1]=1;
    24         for (int i=tot; i; i--){
    25             f[i][0]=f[i+1][0]*S[a[i]][P-1]%P;
    26             if (b[i]) f[i][0]=(f[i][0]+f[i+1][1]*S[a[i]][b[i]-1]%P)%P;
    27             f[i][1]=f[i+1][1]*C[a[i]][b[i]]%P;
    28         }
    29         printf("%d
    ",(f[1][0]+f[1][1])%P);
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    reflow和repaint
    移动端事件
    不支持冒泡的事件
    Gulp
    JAVAWEB项目Tomcat与内网穿透实现外网访问,可连接mysql数据库
    Echarts连接Mysql使用心得
    layui的date组件在弹窗里闪退的解决办法
    Layui的table标签使用记录
    Layui后台实现页面内部的iframe跳转
    第16周作业
  • 原文地址:https://www.cnblogs.com/HocRiser/p/9920532.html
Copyright © 2011-2022 走看看