Open it quickly
有两个限制条件,考虑转化成一个,因此固定一个顺序,这就用转化的方法消除了一个限制。
因此我们算就好。
不 Si?+ 则变成规则,因此分成 a×(b+d),c×d。
因为有地方重复计算减去就好。
车有编号,因此乘上顺序即可。
ans=i=0∑k(ia)(ib+d−(k−i))i!(k−ic)(k−id)(k−i)!
g(x) 为固定的数,问题简单可以转化成模型。
x1+x2+x3+x4+xn=k 的正整数解的组数。
因此答案为:
(n−1g(x)−1)
因为没有取模得用高精度。
但是 ⋯,略。
首先给的是行列数,而我们求的是点上数量,因此先都 +1。
先不考虑不在一条直线上的,答案为 (3n∗m)
在考虑在一条线上的。
有如下三种情况:
- 同一行
- 同一列
- 同一对角线,双对角线是对称的 ×2 即可。
前两个好求分别是 n×(3m),m×(3n)。
第三个我们先考虑固定一个原点,在枚举一个点,两点确定一条直线,看这条直线上有多少个,然后剩下的如果不是在远点,那就是平移,运用乘法原理即可解决。
现在考虑对于同一直线的点的个数,首先我们固定的是 (0,0),(i,j),那么 y=jix,0<x≤i,我们考虑枚举分母的倍数,前提是约分完毕,即y=gcd(i,j)jgcd(i,j)ix,0<x≤i,那么定义域上满足在整点的个数为 gcd(i,j)ji 即 gcd(i,j),减去本身剩下任选即 gcd(i,j)−1,平移有 (n−i)×(m−j) 种情况,因此我们对于每个点要减去的就是 (n−i)×(m−j)×(gcd(i,j)−1)。
不过有个神奇的推式子法,O(n) 做,是莫反。
链接
求
i=0∑k(in)(mod2333)
105 次询问,n,k≤1018,2333 是素数。
跟据 Lucas 定理。
(mn)modp=(pmpn)×(mmodpnmodp)
设 fn,k=∑i=0k(in)。
fn,k=i=0∑k(in)=i=0∑k(pipn)×(imodpnmodp)
因此我们可以发现这就是一个类似于整除分块的东西。
(0pn)i=0∑p−1(inmodp)+⋯+(pkpn)i=0∑kmodp(inmodp)
显然后面形式完整,先略去最后一项。
即
i=0∑p−1(inmodp)j=0∑pk−1(jpn)
代入 f 即 fnmodp,p−1×fpn,pk−1
在加上最后一项,完毕。
ans=fnmodp,p−1×fpn,pk−1+(pkpn)fnmodp,kmodp
显然可以预处理 [0,p−1] 范围内的所有需要的。
O(p2+Tlog23332n)
转化为非降路径计数问题模型,即可解决。
切记(C(n+m,m)−C(n+m,m−1)+p)modp要先加在模,毕竟是模意义下
这题跟上面得一样,只不过需要一步转化。
设 fi 表示为最大前缀和等于 i 的序列数量,显然答案为 ∑i=1ni×fi,但不好求就容斥。
设 gi 表示为最大前缀和大于等于 i 的序列数量,这个好求。
那么 fi 就是差分一下,fi=gi−1−gi。
求 gi 有两种情况。
gi=(nn+m)i≤n−mgi=(n−in+m),i≥n−m
其实就是求得与 y=i 交的路径数量,这是好求的。
这题与上题的区别就是那题是时时刻刻满足 n≤m,而这题则是有出现过一次就好。
剩下的具体图,我太懒了,先放一放。
非降序列,那我们求考虑固定顺序。
结论:任意时刻偶数位个数要满足 ≤ 奇数位个数。
此题同上题,将问题转化后成为卡特兰数模板题。
还有就是模数可能不是质数,我们需要我们转化位整数分解形式约分求解。
因为众所周知费马小定理求逆元适用于模数为素数,扩展欧几里得适用于 gcd(a,p)=1。
除分解质因数还可以通过求 1−n 阶乘种素数个数来求解。
例如,对于素数 p,1−n 中有 pn+p2n+pkn,0<k<logpn。
这题绝对是好题,是道基础容斥题。
前置拉格朗日差值。
求恰好被碾压的人数为 k 显然不好求。
那么考虑容斥。
钦定 fi 为恰好有 i 个人被碾压。
设 gi 为至少有 i 个人被碾压。
g 好求,钦定有 i 个人被撵压,然后对于每一科在剩下的 n−1−i 个人中选出没有被 D 神碾压但是这一科比他低的 n−ri−i 个人,然后枚举 D 神分数,并计算所有人可选的分数的情况的方案数。
即
gi=(in−1)j=1∏m((n−rj−in−1−i)k=1∑ujkn−rj(uj−k)rj−1)
但是由于 u 太大,我们考虑求和变幻。
S=k=1∑uikn−rj(uj−k)rj−1=k=1∑uikn−rjl=0∑rj−1(lrj−1)ujrj−1−l(−k)l=l=0∑rj−1(lrj−1)ujrj−1−l(−1)lk=1∑uikn−rj+l
k=1∑uikn−rj+l
该式是一个 n−rj+l+1 次多项式,可以使用拉格朗日差值 O(n) 求解。
具体证明看上方链接。
那么答案为 fk=∑i=kn−1(−1)i−k(ki)gi。
复杂度 O(nm2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include<iostream> using namespace std; const int N=108; const int mod=1e9+7; int fac[N+1],inv[N+1]; int pre[N],suf[N]; int n,m,K; int u[N],r[N]; int f,g[N]; int qmi(int a,int b){ int res=1; while(b){ if(b&1) res=1ll*res*a%mod; a=1ll*a*a%mod; b>>=1; } return res; } void init(int n){ inv[1]=fac[1]=inv[0]=fac[0]=1; for(int i=2;i<=n;i++){ fac[i]=1ll*fac[i-1]*i%mod; } inv[n]=qmi(fac[n],mod-2); for(int i=n-1;i>1;i--){ inv[i]=1ll*inv[i+1]*(i+1)%mod; } } int C(int n,int m){ return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod; } int calc(int n,int k){ pre[0]=1; suf[k+3]=1; for(int i=1;i<=k+2;i++){ pre[i]=1ll*pre[i-1]*(n-i)%mod; } for(int i=k+2;i>=1;i--){ suf[i]=1ll*suf[i+1]*(n-i)%mod; } int ans=0; int y=0; for(int i=1;i<=k+2;i++){ y=(y+qmi(i,k))%mod; int res1=1ll*pre[i-1]*suf[i+1]%mod; int res2=1ll*fac[i-1]*fac[k+2-i]%mod*(((k+2-i)&1)?-1:1)%mod; ans=(ans+1ll*y*res1%mod*qmi(res2,mod-2)%mod)%mod; } return (ans+mod)%mod; } int lagrange[N][N]; int main(){ cin>>n>>m>>K; for(int i=1;i<=m;i++){ cin>>u[i]; } for(int i=1;i<=m;i++){ cin>>r[i]; } init(n+2); for(int j=1;j<=m;j++){ for(int l=0;l<=r[j]-1;l++){ lagrange[j][l]=calc(u[j],n-r[j]+l); } } for(int i=1;i<=n-1;i++){ int res1=1; for(int j=1;j<=m;j++){ int res2=0; for(int l=0;l<=r[j]-1;l++){ res2=(res2+1ll*C(r[j]-1,l)*qmi(u[j],r[j]-1-l)%mod*((l&1)?-1:1)%mod*lagrange[j][l]%mod)%mod; } res2=1ll*res2*C(n-1-i,n-r[j]-i)%mod; res1=1ll*res2*res1%mod; } g[i]=1ll*C(n-1,i)*res1%mod; } for(int i=K;i<=n-1;i++){ f=(f+1ll*(((i-K)&1)?-1:1)*C(i,K)%mod*g[i]%mod)%mod; } cout<<(f+mod)%mod<<endl; return 0; }
|
对于球相同,盒不同,考虑不定方程计数模型,仅关心每个盒子分配的个体数量。
问题分解是分步还是分类
分步处理,要考虑选取顺序问题
在计数问题,特别区分选取是否有序
一下是一些简单题。
m1,n0,m≤n,每个 1 后面至少有 1 个 0 方案数。
x1+x2+⋯+xm+1=n−m
求解非负整数解个数 (n−mn−m+m+1−1)。
3 蓝球,2 红球,2 黄球,满足黄球不相邻的方案数。
解:
令 S={3b,2r,2y} ,该方案数为 3!2!2!7!。
这是不考虑相不相邻,若相邻就是把两个黄球看成一个整体 S={3b,2r,1y},该方案数为 3!2!6!。
相减就是答案。
S={1a1,1a2,…,∞at+1,…,∞ak},求其的 r 组合数。
分成两集合处理。
i=0∑r(it)(r−ik−t+r−i−1)
S={∞0,∞1,∞2} 种取 n 个数,不允许相邻的两位置相同,问排列数?
固定住一个位置,剩下唯一。
3×2n−1
容斥
多重集的组合数
考虑这个问题:设 S={n1⋅a1,n2⋅a2,⋯,nk⋅ak,} 表示由 n1 个 a1,n2 个 a2,…,nk 个 ak 组成的多重集。那么对于正整数 r,从 S 中选择 r 个元素组成一个多重集的方案数。
这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解:
∀i∈[1,k], xi≤ni, i=1∑kxi=r
于是很自然地想到了容斥原理。容斥的模型如下:
- 全集:i=1∑kxi=r 的非负整数解。
- 属性:xi≤ni。
于是设满足属性 i 的集合是 Si,Si 表示不满足属性 i 的集合,即满足 xi≥ni+1 的集合(转化为上面插板法的问题三)。那么答案即为
∣∣∣∣∣∣i=1⋂kSi∣∣∣∣∣∣=∣U∣−∣∣∣∣∣∣i=1⋃kSi∣∣∣∣∣∣
根据容斥原理,有:
∣∣∣∣∣∣i=1⋃kSi∣∣∣∣∣∣==i∑∣∣∣Si∣∣∣−i,j∑∣∣∣Si∩Sj∣∣∣+i,j,k∑∣∣∣Si∩Sj∩Sk∣∣∣−⋯+(−1)k−1∣∣∣∣∣∣i=1⋂kSi∣∣∣∣∣∣i∑(k−1k+r−ni−2)−i,j∑(k−1k+r−ni−nj−3)+i,j,k∑(k−1k+r−ni−nj−nk−4)−⋯+(−1)k−1(k−1k+r−∑i=1kni−k−1)
拿全集 ∣U∣=(k−1k+r−1) 减去上式,得到多重集的组合数
Ans=p=0∑k(−1)pA∑(k−1k+r−1−∑AnAi−p)
其中 A 是充当枚举子集的作用,满足 ∣A∣=p, Ai<Ai+1。
至于像这种容斥我们就应该考虑集合的所有子集去统计答案。
__END__