https://codeforces.com/contest/1111/problem/D

多重排列 + 反向01背包

题意:

给你一个字符串(n<=1e5,n为偶数),有q个询问,每次询问两个位置x和y,问将和x,y相同的所有字符移到前半段或者后半段,并且剩下的所有字符都要在同一半段的方案数,字符是大写小写字母

题解:

  • 首先不考虑x和y位置,假设前半段的排列数为\((n/2)!/(cnt[x_1]!*...*cnt[x_n]!)\),后半段的排列为\((n/2)!/(cnt[y_1]!*...*cnt[y_n]!)\),那么总的排列数就是\((n/2)!/(cnt[1]!*...*cnt[n]!)\) 多重排列公式
  • 对于每个字符,有全部取或者全部不取两种,因此可以用一个容量为n/2的01背包求出总的分配方案数
  • 因为只有52个字符,所以可以预处理出任意两个字符的分配方案数
  • 答案就是 \(2*总排列数*分配方案数\)

处理

  • 累加方案数的时候反向处理,减去方案数的时候正向处理(常见)

即正常累加01背包的时候都是反着扫,但是用总方案减去非法方案的时候需要正着扫

  • 附上线性逆元,阶乘,逆元阶乘打表板子

代码

#include<bits/stdc++.h>
#define P 1000000007
#define M 100005
#define ll long long
using namespace std;
ll f[60][60],c[60],inv[M],F[M],tp[M],dp[M],ans,Finv[M];
int i,j,x,y,q,n,l,r;
string s;
void init(){
cin>>s>>q;n=s.size();
F[0]=Finv[0]=inv[0]=1;
F[1]=Finv[1]=inv[1]=1;
for(i=2;i<M;i++){
inv[i]=inv[P%i]*(P-P/i)%P;
Finv[i]=Finv[i-1]*inv[i]%P;
F[i]=F[i-1]*i%P;
}
for(i=0;i<n;i++){
if(s[i]>='a'&&s[i]<='z')c[s[i]-'a'+1]++;
else c[s[i]-'A'+27]++;
}
ans=F[n/2]*F[n/2]%P;
for(i=1;i<=52;i++)
if(c[i])ans=ans*Finv[c[i]]%P;
dp[0]=1;
for(i=1;i<=52;i++)if(c[i])
for(j=n/2;j>=c[i];j--)dp[j]=(dp[j]+dp[j-c[i]])%P;
for(x=1;x<=52;x++){
for(y=1;y<=52;y++){
for(i=0;i<=n/2;i++)tp[i]=dp[i];
for(i=c[x];i<=n/2;i++)tp[i]=(tp[i]-tp[i-c[x]]+P)%P;
if(x!=y)for(i=c[y];i<=n/2;i++)tp[i]=(tp[i]-tp[i-c[y]]+P)%P;
f[x][y]=tp[n/2];
}
}
}
int main(){
init();
while(q--){
scanf("%d%d",&l,&r);
l--;r--;
if(s[l]>='a'&&s[l]<='z')l=s[l]-'a'+1;
else l=s[l]-'A'+27;
if(s[r]>='a'&&s[r]<='z')r=s[r]-'a'+1;
else r=s[r]-'A'+27;
printf("%lld\n",2ll*ans%P*f[l][r]%P);
}
}

CodeCraft-19 and Codeforces Round #537 (Div. 2) D 多重排列 + 反向01背包 + 离线处理的更多相关文章

  1. CodeCraft-19 and Codeforces Round #537 Div. 2

    D:即有不超过52种物品,求容量为n/2的有序01背包方案数.容易想到设f[i][j]为前i种物品已用容量为j的方案数,有f[i][j]=f[i-1][j-a[i]]*C(n/2-j+a[i],a[i ...

  2. CodeCraft-19 and Codeforces Round #537 (Div. 2) E 虚树 + 树形dp(新坑)

    https://codeforces.com/contest/1111/problem/E 题意 一颗有n个点的树,有q个询问,每次从树挑出k个点,问将这k个点分成m组,需要保证在同一组中不存在一个点 ...

  3. CodeCraft-19 and Codeforces Round #537 (Div. 2) 题解

    传送门 D. Destroy the Colony 首先明确题意:除了规定的两种(或一种)字母要在同侧以外,其他字母也必须在同侧. 发现当每种字母在左/右边确定之后,方案数就确定了,就是分组的方案数乘 ...

  4. CodeCraft-19 and Codeforces Round #537 (Div. 2) C. Creative Snap 分治

    Thanos wants to destroy the avengers base, but he needs to destroy the avengers along with their bas ...

  5. 【CodeCraft-19 and Codeforces Round #537 (Div. 2) C】Creative Snap

    [链接] 我是链接,点我呀:) [题意] 横坐标1..2^n对应着2^n个复仇者的基地,上面有k个复仇者(位置依次给出). 你是灭霸你要用以下方法消灭这k个复仇者: 一开始你获取整个区间[1..2^n ...

  6. Codeforces Round #532 (Div. 2) F 线性基(新坑) + 贪心 + 离线处理

    https://codeforces.com/contest/1100/problem/F 题意 一个有n个数组c[],q次询问,每次询问一个区间的子集最大异或和 题解 单问区间子集最大异或和,线性基 ...

  7. Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)

    题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...

  8. Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum(离线树状数组)

    http://codeforces.com/contest/703/problem/D 题意: 给出一行数,有m次查询,每次查询输出区间内出现次数为偶数次的数字的异或和. 思路: 这儿利用一下异或和的 ...

  9. Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

随机推荐

  1. python之集合【set】

    初学python,今天晚上学习了set,做下set的总结,set的中文名也就是[集合],set的总结分为两部分,第一部分是set的创建,第二部分是set的操作,也就是set的功能:set的特点是无序的 ...

  2. win10装回win7。PE下把原来的系统盘格掉,再安装hdd,重启就好了

    win10装回win7.安装文件解压到某盘根目录,然后 PE下把原来的系统盘格掉,再安装hdd,重启就好了

  3. union和union all区别

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并在一起显示出来. union和unio ...

  4. 关于控制反转(IOC)容器 ,依赖注入(DI)模式必读文章收集

    推荐一篇国外設計大師Martin Fowler的大作:Inversion of Control Containers and the Dependency Injection pattern http ...

  5. Svn Server 强制提交者输入注释信息

    目的:在项目开发过程中,强制团队成员必须在提交前写上注释 环境简述:SVN服务器:Windows Server 2008 SVN版本:VisualSVN Ltd.  2.7.5 操作方法:在SVN的R ...

  6. prometheus 通过企业微信接收告警

    准备工作 step 1: 访问网站 注册企业微信账号(不需要企业认证). step 2: 访问apps 创建第三方应用,点击创建应用按钮 -> 填写应用信息: prometheus 配置: # ...

  7. iOS.CocoaPods.0

    1. CocoaPods CocoaPods 是Objective-C (iOS and OS X) projects 的依赖管理器. A CocoaPod (singular) is a speci ...

  8. RNA-seq流程需要进化啦!

    RNA-seq流程需要进化啦! Posted on 2015年9月25日 Tophat 首次被发表已经是6年前 Cufflinks也是五年前的事情了 Star的比对速度是tophat的50倍,hisa ...

  9. NOI导刊 2018河南郑州游记

    前言 本蒟蒻来自浙江的弱市弱校,因为不想两年\(OI\)一场空,以及想出去玩,所以与同届大佬一起报了\(NOI\)导刊,希望能留下点不错的记忆吧. \(Day\ 0\) \(10\)月\(1\)日 经 ...

  10. TP QQ 微信 微博登录

    use Org\Util\QQconnect; use Org\Util\Wechatauth; use Org\Util\SaeTOAuthV2; use Org\Util\SaeTClientV2 ...