简要题意:

请你对满足下列条件的正整数序列 A1,A2⋯AnA_1,A_2\cdots A_nA1​,A2​⋯An​ 进行计数。

  1. ∀1≤i≤n,Li≤Ai≤Ri\forall 1\leq i\leq n,L_i\leq A_i\leq R_i∀1≤i≤n,Li​≤Ai​≤Ri​
  2. 令 S=∑i=1nAiS=\sum\limits_{i=1}^nA_iS=i=1∑n​Ai​ 给出 DDD 进制数字集合 TTT ,满足要求的 SSS 的 DDD 进制拆分中的所有数字都应该属于 TTT 集合。

n≤12,D≤500,1≤Li≤Ri≤D500n\leq 12 ,D\leq 500,1\leq L_i\leq R_i\leq D^{500}n≤12,D≤500,1≤Li​≤Ri​≤D500


题解:

首先高精度是跑不掉的了。。。

由于 nnn 很小,可以考虑把问题转化成只有下界进行容斥。

设 SSS 为所有下界之和+1 ,假设总和为 VVV ,由于没有上界,显然方案数就是 (V−Sn−1){V-S\choose n-1}(n−1V−S​) ,用隔板法考虑即可。

那么每一次要求的东西就是 ∑V=SINF(V−Sn−1)[V合法]\sum\limits_{V=S}^{INF}{V-S\choose n-1}[V 合法]V=S∑INF​(n−1V−S​)[V合法]

考虑范德蒙德恒等式 :(n+mk)=∑i=0k(nk)(mk){n+m\choose k}=\sum\limits_{i=0}^k{n\choose k}{m\choose k}(kn+m​)=i=0∑k​(kn​)(km​) ,这个等式在广义组合数上仍然成立。

于是我们只需要用数位DP,求出 ∑V=SINF(Vi)[V合法]\sum\limits_{V=S}^{INF}{V\choose i}[V合法]V=S∑INF​(iV​)[V合法] ,然后用 (−Si){-S\choose i}(i−S​) 来计算即可。

DP过程中的转移也需要依赖范德蒙德恒等式。

复杂度 O(2nn2log⁡D(∑R))O(2^nn^2\log_D(\sum R))O(2nn2logD​(∑R)),高精度不是复杂度瓶颈。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constusing std::cerr;
using std::cout;cs int mod=1e9+7;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}cs int N=15,SIZE=527,D=5e2+7;using Int=std::vector<int>;int B;Int& operator++(Int &a){if(!a.size())a.push_back(0);int b=1;for(int re i=0;i<(int)a.size();++i)if((a[i]+=b)>=B)a[i]-=B,b=1;else b=0;if(b)a.push_back(b);return a;
}Int& operator--(Int &a){if(!a.size())a.push_back(0);a[0]-=1;for(int re i=0;a[i]<0;++i)a[i]+=B,a[i+1]--;while(a.size()&&!a.back())a.pop_back();return a;
}Int gI(){static int len;Int a;static char s[1507];static int num[1507];scanf("%s",s);len=strlen(s);for(int re i=0;i<len;++i)num[len-i]=s[i]^48;while(len){int t=0;for(int re i=len;i;--i)t=t*10+num[i],num[i]=t/B,t%=B;a.push_back(t);while(len&&!num[len])--len;}return a;
}Int &operator+=(Int &a,cs Int &b){if(a.size()<b.size())a.resize(b.size());for(int re i=0;i<(int)b.size();++i)a[i]+=b[i];for(int re i=0;i+1<(int)a.size();++i)if(a[i]>=B)a[i+1]++,a[i]-=B;if(a.size())while(a.back()>=B){int t=a.back();a.back()%=B;a.push_back(t/B);}return a;
}int get_mod(cs Int &a){int res=0;for(int re i=a.size()-1;~i;--i)Mul(res,B),Inc(res,a[i]);return res;
}int n,ans;
int good[D];Int L[N],R[N],S;
int C[SIZE][D][N],Len;
int pr[SIZE][D][N],sf[SIZE][D][N];
int inv[N];int G[N];
int F[2][2][N];int calc(){int t=0,s=1,Sl=S.size()-1;memset(G,0,sizeof G);S.resize(Len);memset(F[t],0,sizeof F[t]);F[t][1][0]=1;for(int re i=0;i<Len;++i){t^=1,s^=1;memset(F[t],0,sizeof F[t]);for(int re x=0;x<n;++x){if(!F[s][0][x]&&!F[s][1][x])continue;int sm=add(F[s][0][x],F[s][1][x]);int *pr=nullptr,*sf=nullptr,*C,*f0,*f1;C=::C[i][S[i]],f0=F[t][0],f1=F[t][1];if(S[i]-1>=0)pr=::pr[i][S[i]-1];if(S[i]+1<B)sf=::sf[i][S[i]+1];for(int re y=0;x+y<n;++y){if(S[i]-1>=0)Inc(f0[x+y],mul(sm,pr[y]));if(S[i]+1<B){Inc(f1[x+y],mul(sm,sf[y]));if(i>=Sl)Inc(G[x+y],mul(sm,sf[y]));}Inc(f0[x+y],mul(F[s][0][x],C[y]));Inc(f1[x+y],mul(F[s][1][x],C[y]));if(i==Sl)Inc(G[x+y],mul(F[s][1][x],C[y]));}}}s=dec(0,get_mod(S));int res=0;for(int i=0,c=1;i<n;++i){if(i)Mul(c,mul(dec(s,i-1),inv[i]));Inc(res,mul(G[n-1-i],c));}return res;
}void Main(){scanf("%d%d",&n,&B);for(int re i=0;i<B;++i)scanf("%d",good+i);for(int re i=0;i<n;++i)L[i]=gI(),--L[i],R[i]=gI(),S+=R[i];Len=S.size()+2;inv[0]=inv[1]=1;for(int re i=2;i<n;++i)inv[i]=mul(mod-mod/i,inv[mod%i]);for(int i=0,pw=1;i<Len;++i,Mul(pw,B)){for(int re d=0;d<B;++d)if(good[d]){C[i][d][0]=1;for(int re j=1;j<n;++j)C[i][d][j]=mul(mul(C[i][d][j-1],inv[j]),dec(mul(pw,d),j-1));}for(int re d=0;d<B;++d)for(int re j=0;j<n;++j)pr[i][d][j]=add(d==0?0:pr[i][d-1][j],C[i][d][j]);for(int re d=B-1;~d;--d)for(int re j=0;j<n;++j)sf[i][d][j]=add(d==B-1?0:sf[i][d+1][j],C[i][d][j]);}for(int re s=0;s<(1<<n);++s){S.clear();S.push_back(1);int ct=0;for(int re i=0;i<n;++i)(s&(1<<i))?(++ct,S+=R[i]):(S+=L[i]);ct&1?Dec(ans,calc()):Inc(ans,calc());}cout<<ans<<"\n";
}inline void file(){#ifdef zxyoifreopen("A.in","r",stdin);
#endif
}signed main(){file();Main();return 0;}

【校内模拟】A(容斥原理)(数位DP)(范德蒙德恒等式)(高精度)相关推荐

  1. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  2. 洛谷·幼儿园篮球题【including范德蒙德卷积,二项式反演

    初见安~时隔良久我又回来写多项式了[靠 还是放在题目前面吧,简单讲一下这两个东西. 一.范德蒙德卷积 可以理解为:在两个有n个石子和m个石子的堆里面共选k个石子的方案数.这样这个等式的成立就很显然了. ...

  3. 半正定Toeplitz矩阵的范德蒙德分解

    半正定Toeplitz矩阵的范德蒙德分解 Toeplitz矩阵的定义:Matrices whose entries are constant along each diagonal are calle ...

  4. 范德蒙德和Teoplitz方程组的解法

    范德蒙德和Teoplitz方程组的解法 简单介绍 工程中的很多实际问题的处理,比如说图像处理的某些情况,最后往往归结为比较容易处理的Vandermonde方程组和Teoplitz方程组的求解问题,因此 ...

  5. C语言二维数组范德蒙,浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  6. 浅谈范德蒙德(Vandermonde)方阵的逆矩阵的求法以及快速傅里叶变换(FFT)中IDFT的原理...

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

  7. 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)

    [题解]幼儿园篮球题 题目就是要我们求一个式子 \[ \sum_{i=1}^{S}{\dfrac 1 {{M\choose m_i}{N-M\choose n_i-m_i}}}\sum_{j=0}^{ ...

  8. Codeforces-1473-G. Tiles (范德蒙德卷积+快速数论变换NTT)

    题目 传送门 思路 这是题解的思路:传送门 我就再具体写写我对题解的几点理解吧. 首先,解决这个递推式的问题: ansi+1,j=∑k=1mCa+bb−k+jansi,kans_{i+1,j}=\su ...

  9. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]

    4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...

最新文章

  1. 024_Word知识汇总
  2. javascript中的事件问题的总结
  3. mysql报错注入_关于Mysql注入过程中的三种报错方式
  4. ESP系列AT指令开发笔记
  5. APP不显示GPU过度渲染的问题
  6. 不要仅仅依靠单元测试
  7. Hibernate配置C3P0连接池(在配好基本的hibernate配置下使用)
  8. python io_Python 的 io.StringIO()
  9. 【ElasticSearch】 ElasticSearch 写入流程
  10. IK(反向动力学)简单原理与实现
  11. Autosar NM
  12. 计算机教师素养有哪些内容,现代教师应具备哪些教育技术能力
  13. TSP问题解决:模拟退火、贪心法、爬山法,Python实现
  14. java生成指定范围的随机数(太屌了)
  15. 系统集成项目管理工程师主要公式
  16. 互联网快讯:小米公益平台正式上线;极米优质投影产品获好评;三星公布三款新型车用芯片
  17. STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】
  18. Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource.
  19. 扫地机器人的轮子困住_扫地机器人被“困住”的解决办法
  20. PYQT5水平布局后垂直方向控件间距的调整方法

热门文章

  1. 大疆前端开发笔试总结
  2. 抖音快手网红便签软件是哪款?
  3. 解决:wamp一直显示橙色无法变绿
  4. 前景无限的golang,分分钟高薪offer
  5. 《画解数据结构》(0 - 4)- 逻辑结构
  6. [益智]:蚂蚁走树枝
  7. 高中计算机社团组建总结,高中社团总结
  8. xunsearch php实例,xunsearch系列(一)安装篇
  9. Spring如何整合Mybatis?
  10. 【详细】2021阿里云免费SSL证书申请