首页 > 其他分享 >CF1838E - Count Supersequences

CF1838E - Count Supersequences

时间:2023-06-05 18:11:34浏览次数:55  
标签:Count Supersequences int res fpow 1ll CF1838E fac binom

先考虑正着做,我们只考虑整个 \(b\) 序列中出现的第一个子序列 \(a\)。

这样,我们就是要往 \(a\) 中插入 \(m-n\) 个数,其中 \(a_{i-1}\) 和 \(a_i\) 之间不能有 \(a_i\)(否则就会有更靠前的子序列)。\(a_1\) 前面不能有 \(a_1\),\(a_n\) 后面什么都可以有。

我们发现,我们可以先枚举 \(a_n\) 前面有多少个数,\(a_n\) 前面的数的值域都是 \(k-1\),具体哪一种不能选取决于其后面的一个 \(a\),但是无关紧要。\(a_n\) 后面填什么都行。对于前面的,还要分成 \(n\) 段(允许为空),可以直接扩展插板法。

所以,答案就是 \(\sum_{i=0}^m\binom{n-1+i}{i}(k-1)^ik^{m-i}\)。但是我们发现这样要枚举 \(i\) 是不能接受的。

考虑这个做法最麻烦的地方在哪里,就是最后一段填什么都行。消掉这个限制,即考虑正难则反,计算包含 \(a\) 的前缀 \(i\) 且不包含 \(a\) 的前缀 \(i+1\) 的方案数。这样,总的答案就是 \(k^m-\sum_{i=0}^{n-1}f(i)\),\(f(i)\) 很好计算,因为这个时候,\(a_i\) 后面也有了值域不能是 \(a_{i+1}\) 的限制,大家的值域都是 \(k-1\),所以 \(f(i)=\binom{m}{i}(k-1)^i\)。

这时还有最后一个问题,计算 \(\binom{m}{i}\),发现 \(\binom{m}{i}=\dfrac{m!}{i!(m-i)!}=\dfrac{m!}{(i-1)!(m-i+1)!}\dfrac{m-i+1}{i}=\dfrac{m-i+1}{i}\binom{m}{i-1}\),也就可以根据上一次的递推计算,起点是 \(\binom{m}{0}=1\)。

也就可以计算了。

const int P=1000000007;
int n,m,k,a[200005],fac[200005],ifac[200005];
inline int fpow(int a,int p){
	if(!p)return 1;
	int res=fpow(a,p>>1);
	if(p&1)return 1ll*res*res%P*a%P;
	return 1ll*res*res%P;
}
inline void init(){
	fac[0]=ifac[0]=1;
	rep(i,1,200000)fac[i]=1ll*fac[i-1]*i%P;
	rep(i,1,200000)ifac[i]=fpow(fac[i],P-2);
}
inline int C(int n,int m){
	return 1ll*fac[n]*ifac[m]%P*ifac[n-m]%P;
}
inline void solve(){
	cin>>n>>m>>k;
	rp(i,n)cin>>a[i];
	int ans=fpow(k,m),res=1;
	rep(i,0,n-1){
		if(i)res=1ll*res*fpow(i,P-2)%P*(m-i+1)%P;
		ans=(ans-1ll*res%P*fpow(k-1,m-i)%P+P)%P;
	}cout<<ans<<endl;
} 
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;cin>>t;
	init();
	rd(_,t)solve();
	return 0;
}
//Nyn-siyn-hert

标签:Count,Supersequences,int,res,fpow,1ll,CF1838E,fac,binom
From: https://www.cnblogs.com/jucason-xu/p/17458625.html

相关文章

  • python requests请post接口200,打印提示Unexpected character encountered while parsi
    pythonrequests发起httppost请求,带参数,带请求头,代码设置检查没有问题runpy文件提示Unexpectedcharacterencounteredwhileparsingvalue:p.Path,问题一:body请求形式未进行json格式data=json.dumps(body)dumps的功能是将字典类型转换未json格式的字符串类型。......
  • [ABC202E] Count Descendants 题解
    CountDescendants题目大意给定一颗以\(1\)为根的树,多次询问求某点的子树中深度为给定值的点的个数。思路分析对于每个深度开一个vector,从大到小存下这个深度的所有点的dfs序开始值和结束值,询问时只需要在对应深度的vector中二分作差即可。代码#include<iostream>#......
  • Count of Integers
    CountofIntegersYouaregiventwonumericstrings num1 and num2 andtwointegers max_sum and min_sum.Wedenoteaninteger x tobe good if:num1<=x<=num2min_sum<=digit_sum(x)<=max_sum.Returnthenumberofgoodintegers.Sincethe......
  • 实验 透视表 计数 len np.count_nonzero 正确与否
    实验透视表计数 len np.count_nonzero正确与否结果:len正确 np.count_nonzero错误结论:除去三行干扰行(原值均为缺失值)以外:未过账中,有1行无业务员名称无业务员名称中,有1行未过账即:未过账且无业务员名称有1行未过账且有业务员名称有57行已过账且无业务员名称有57行最......
  • pandas value_counts() 会忽略统计nan 但是不会忽略 true false
    pandasvalue_counts()会忽略统计nan 但是不会忽略truefalse'''每列包含多少项nan'''foriindf_2:print(df_2.loc[:,i].isna().value_counts())应用'''每列包含多少项nan'''dict_counts={}foriindf_2:......
  • 300iq Contest 2 C Counting Cactus
    这个数据范围显然是要状压的。考虑一个子集\(S\),钦定他的根是\(u\)该如何转移(设为\(f(u,S)\)):\(u\)会在若干个环中,还会有若个用一条边分割的子仙人掌。也就是若干子仙人掌拼起来。自然需要再设一个\(g(u,S)\)表示\(u\)为根,且\(u\)只包含在一个环或一条边中的方案数。......
  • Java多线程三(线程池执行完后再执行主线程)CountDownLatch
      我们在开发多线程的时候,有两种情况一种是我们处理好后,不用管结果。比如我需要查询某些数据然后存在数据库里。还有一种就是查询好数据(通过线程池),然后导出数据。这个就比较麻烦。因为我们要将数据通过多线程处理后,返回一个统一的结果。(由于多线程是在不同的时候执行数据),假如执......
  • D. The BOSS Can Count Pairs
    D.TheBOSSCanCountPairsYouaregiventwoarrays$a$and$b$,bothoflength$n$.Yourtaskistocountthenumberofpairsofintegers$(i,j)$suchthat$1\leqi<j\leqn$and$a_i\cdota_j=b_i+b_j$.InputEachtestcontainsmultipletest......
  • 5.5. Java并发工具类(如CountDownLatch、CyclicBarrier等)
    5.5.1CountDownLatchCountDownLatch是一个同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作。CountDownLatch有一个计数器,当计数器减为0时,等待的线程将被唤醒。计数器只能减少,不能增加。示例:使用CountDownLatch等待所有线程完成任务假设我们有一个任务需要三个子......
  • 「题解」ABC292G Count Strictly Increasing Sequences
    没一眼看出来还是拉了。考虑区间dp,\(f_{i,l,r}\)表示\([l,r]\)前\((i-1)\)位都相同,看后面\([i,n]\)位填数使得递增的方案数是多少。这样已经可以做了,但是还不够,要追求一下最简单的写法。想想,发现每次dp是要分为多个儿子乘起来,内部还要搞个dp。但可以改成每次两个儿子......