把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【CF660E】Different Subsets For All Tuples(组合数学)

点此看题面

大致题意: 有一个长度为n的数列,每个位置上数字的值在[1,m]范围内,则共有mn种可能的数列。分别求出每个数列中本质不同的子序列个数,然后求和。

一些分析

首先,我们单独考虑空序列的个数mn,然后接下来就可以只考虑非空序列的个数了。

假设有一个长度为i的子序列(1in),且其在序列中的位置分别为pos1,pos2,...,posi,值分别为val1,val2,...,vali

则我们强制在1pos11范围内不能出现val1pos1+1pos21范围内不能出现val2,以此类推。

所以,在前posi个位置中,除pos1ii个位置填valii外,如上所述,其余posii个位置各有m1种填法。

而在第posi个位置之后就可以随便填了,每个位置都有m种填法。

推式子

通过之前的分析,于是得到式子如下:

i=1nmij=inCj1i1(m1)jimnj

对于这个式子的解释:

首先,用i枚举子序列长度,而长度为i的子序列共有mi种可能。

接下来j枚举posi,而pos1i1依次选择[1,posi1](即这里的[1,j1])这个范围内的任意位置都是合法的,就相当于在j1个位置中选择i1个位置,方案数就是Cj1i1

从前文可得,posii(即这里的ji)个位置有m1种填法,nposi(即这里的nj)个位置有m种填法。

于是便得到上述式子。

然后就是化简:

先移项,把mi移进去得到:

i=1nj=inCj1i1(m1)jimnj+i

改变枚举顺序,得到:

j=1ni=1jCj1i1(m1)jimnj+i

观察到组合数中的i1j1,不难想到直接将枚举的i,j1,即:

j=0n1i=0j1Cji(m1)(j+1)(i+1)mn(j+1)+(i+1)

然后我们可以化简一下系数,发现这些11恰好抵消了,得到:

j=0n1i=0j1Cji(m1)jimnj+i

然后我们拎出mnj,就可以得到:

j=0n1mnji=0j1Cji(m1)jimi

那这样有什么好处呢?

回想一下二项式定理(x+y)n=i=0n1xiyni

这似乎与上面式子的后半部分有几分相似。

于是就可以化简得到:

j=0n1mnj((m1)+m)j=j=0n1mnj(2m1)j

这个式子可以O(nlogn)快速幂计算,也可以直接O(n)计算。

总而言之,可以过了。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000000
#define X 1000000007
#define Qinv(x) Qpow(x,X-2)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,m;
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
int main()
{
    RI i,ans,p1,p2,b1,b2;
    scanf("%d%d",&n,&m),ans=p1=Qpow(m,n),p2=1,b1=Qinv(m),b2=(1LL*2*m-1)%X;//初始化
    for(i=0;i^n;++i) Inc(ans,1LL*p1*p2%X),p1=1LL*p1*b1%X,p2=1LL*p2*b2%X;//O(n)计算答案
    return printf("%d",ans),0;//输出答案
}
posted @   TheLostWeak  阅读(249)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
一些分析推式子代码
点击右上角即可分享
微信分享提示