博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UOJ86]mx的组合数——NTT+数位DP+原根与指标+卢卡斯定理
阅读量:6335 次
发布时间:2019-06-22

本文共 3841 字,大约阅读时间需要 12 分钟。

题目链接:

题目大意:给出四个数$p,n,l,r$,对于$\forall 0\le a\le p-1$,求$l\le x\le r,C_{x}^{n}\%p=a$的$x$的数量。$p<=3000$且保证$p$是质数,$n,l,r<=10^30$。

对于$10\%$的数据,可以直接杨辉三角推。

对于$20\%$的数据,因为$n$是确定的,可以递推出$C_{x+1}^{n}=C_{x}^{n}*\frac{x+1}{x+1-n}$。
对于另外$20\%$的数据,可以枚举$x$然后用$lucas$定理求。
对于另外$30\%$的数据,可以想到将问题转化成小于等于$r$的个数$-$小于等于$l-1$的个数。由$lucas$定理可知,$C_{x}^{n}\ mod\ p=\prod C_{b_{i}}^{a_{i}}\ mod\ p$,其中$a_{i},b_{i}$分别为$n,x$在$p$进制下的第$i$位。那么我们就可以用数位$DP$求,$f[i][j]$代表从最低为开始的前$i$位,每一位的值都不大于$b_{i}$且$\%p=j$的方案数;$g[i][j]$代表从最低为开始的前$i$位,每一位的值任意且$\%p=j$的方案数。设枚举第$i+1$位为$x$,$C_{x}^{a_{i+1}}=k$。那么可以得到$DP$转移方程$g[i+1][jk\ mod\ p]+=g[i][j]$,若$x<b_{i+1}$,则$f[i+1][jk\ mod\ p]+=g[i][j]$,若$x=b_{i+1}$,则$f[i+1][jk\ mod\ p]+=f[i][j]$。时间复杂度为$O(p^2log_{p})$。
对于$100\%$的数据,我们考虑优化上述$DP$,我们拿其中第一个转移方程来说(后两个同理),我们设$h[k]=\sum\limits_{x=0}^{p-1}[C_{x}^{a_{i+1}}==k]$。可以发现转移可以看成是$G[j*k\ mod\ p]=\sum\limits_{j=0}^{p-1}g[j]\sum\limits_{k=0}^{p-1}h[k]$,这和卷积式子很像,但他是乘法卷积,我们想办法将它变成加法卷积:因为$p$是质数,那么$p$一定有原根(设为$g$),也就是说对于任意$j$,其中$1\le j\le p-1$都有指标。我们设它的指标为$ind(j)$,那么$j*k\ mod\ p$就能转化为$g^{(ind(j)+ind(k))\ mod\ (p-1)}\ mod\ p$。这样我们就能用$FFT$或$NTT$来加速$DP$了,但注意到$0$没有指标,我们在转移时先忽略$0$,在最后输出答案时用总个数减掉其他答案就是$\%p=0$的个数了。注意原根从$1$开始枚举。至于$10^{30}$可以用$\_\_int128$存。时间复杂度为$O(plog_{p}^2)$。

两种写法,读者自选。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long longtypedef __int128 int128;#define MOD 998244353using namespace std;int p;int128 l,r,n;int pr[10];int cnt;int G;int mx;ll sum;int ind[30010];ll f[100000];ll g[100000];ll h[100000];int a[200];int b[200];ll ans[30010];int c[200][30010];int mask=1;ll s[100000];char *p1,*p2,buf[100000];#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)int read_(){ int x=0; char c=nc(); while(c<48) { c=nc(); } while(c>47) { x=(((x<<2)+x)<<1)+(c^48),c=nc(); } return x;}int128 read() { int128 x=0; char c=nc(); while(c<48) { c=nc(); } while(c>47) { x=(((x<<2)+x)<<1)+(c^48),c=nc(); } return x;}ll quick(int x,int y,int mod){ ll res=1ll; while(y) { if(y&1) { res=res*x%mod; } y>>=1; x=1ll*x*x%mod; } return res;}void NTT(ll *a,int len,int miku){ for(int k=0,i=0;i
k) { swap(a[i],a[k]); } for(int j=len>>1;(k^=j)
>=1); } for(int k=2;k<=len;k<<=1) { int t=k>>1; int x=quick(3,(MOD-1)/k,MOD); if(miku==-1) { x=quick(x,MOD-2,MOD); } for(int i=0;i
=b[k]) { h[ind[c[k][a[k]]]]++; NTT(h,mask,1); for(int i=0;i
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long longtypedef __int128 int128;#define MOD 998244353using namespace std;int p;int128 l,r,n;int pr[10];int cnt;int G;int mx;ll sum;int ind[30010];ll f[100000];ll g[100000];ll A[100000];ll B[100000];ll C[100000];int a[200];int b[200];ll ans[30010];int c[200][30010];int mask=1;int s[100000];int pw[300010];int fac[300010];int inv[300010];char *p1,*p2,buf[100000];#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)int read_(){ int x=0; char c=nc(); while(c<48) { c=nc(); } while(c>47) { x=(((x<<2)+x)<<1)+(c^48),c=nc(); } return x;}int128 read() { int128 x=0; char c=nc(); while(c<48) { c=nc(); } while(c>47) { x=(((x<<2)+x)<<1)+(c^48),c=nc(); } return x;}ll quick(int x,int y,int mod){ ll res=1ll; while(y) { if(y&1) { res=res*x%mod; } y>>=1; x=1ll*x*x%mod; } return res;}void NTT(ll *a,int len,int miku){ for(int k=0,i=0;i
k) { swap(a[i],a[k]); } for(int j=len>>1;(k^=j)
>=1); } for(int k=2;k<=len;k<<=1) { int t=k>>1; int x=quick(3,(MOD-1)/k,MOD); if(miku==-1) { x=quick(x,MOD-2,MOD); } for(int i=0;i
=1;i--) { inv[i]=inv[i+1]*(i+1)%p; } for(int i=1;i<=120;i++) { for(int j=b[i];j

转载于:https://www.cnblogs.com/Khada-Jhin/p/10460022.html

你可能感兴趣的文章
MapGuide应用最佳实践----资源库Repository的维护
查看>>
Symbian手机实现关机
查看>>
大端和小端(Big endian and Little endian)
查看>>
iOS开发-观察者模式
查看>>
HDF及HDF-EOS数据格式简介
查看>>
使用AjaxPro实现ajax效果
查看>>
[转] c#中的unchecked是什么意思,起什么作用?
查看>>
64位操作系统下IIS报 试图加载格式不正确的程序 的解决方案
查看>>
远哥推荐:面向网络的数据库 Neo4j
查看>>
前端模板引擎语法
查看>>
用互联网思想武装自己
查看>>
任务栏上的资源管理器图标,没有jump list?其他都有。
查看>>
第 23 章 设备管理
查看>>
Spark教程
查看>>
SQL Server--用户自定义函数
查看>>
CentOS 6.5安装TortoiseSVN svn client
查看>>
运维利器-ClusterShell集群管理操作记录
查看>>
Response.Write 用法总结
查看>>
dreamweaver jquery代码提示安装,DW JQ代码智能提示
查看>>
英语应用文写作之道歉信
查看>>