01二重退背包+组合数学——cf1111d
退背包进阶,还是挺难想的
/*
dp1[k]表示取到体积k的方案数
dp2[i][j][k]表示左侧必选ij的情况下,取到体积k的方案数
dp2[i][j][k]=dp1[k]-左侧不选ij的方案数
但是这样比较难搞,我们把状态转换一下,dp2[i][j][k]表示左侧不选i,j,取到k的方案数
这样要两层退背包来解决
状态前两维可以直接压缩,用ans[i][j]来保存答案,复杂度O(52*52*n)
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long
#define mod 1000000007
ll f[maxn],inv[maxn],invf[maxn];
void init(){
f[]=inv[]=invf[]=invf[]=;
for(int i=;i<maxn;i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<maxn;i++){
f[i]=f[i-]*i%mod;
invf[i]=invf[i-]*inv[i]%mod;
}
} char s[maxn];
ll cnt[],n,C;
ll dp1[maxn],dp2[maxn],dp3[maxn],ans[][];
void work(){
//先处理背包
dp1[]=;
for(int i=;i<;i++)
if(cnt[i])
for(int j=n/;j>=cnt[i];j--)
dp1[j]=(dp1[j]+dp1[j-cnt[i]])%mod;
for(int i=;i<;i++)
if(cnt[i]){
//先退去一层:没有底i个物品时的状态dp2
memset(dp2,,sizeof dp2);
for(int k=;k<=n/;k++)
if(k<cnt[i]) dp2[k]=dp1[k];
else dp2[k]=(dp1[k]-dp2[k-cnt[i]]+mod)%mod;
ans[i][i]=dp2[n/]; for(int j=;j<;j++)
if(j!=i && cnt[j]){
//再退一层背包
memset(dp3,,sizeof dp3);
for(int k=;k<=n/;k++)
if(k<cnt[j])dp3[k]=dp2[k];
else dp3[k]=(dp2[k]-dp3[k-cnt[j]]+mod)%mod;
ans[i][j]=ans[j][i]=dp3[n/];
}
}
} int main(){
init();
scanf("%s",s);
n=strlen(s);
for(int i=;i<n;i++){
if(s[i]<='Z' && s[i]>='A')
cnt[s[i]-'A']++;
else cnt[s[i]-'a'+]++;
} C=*f[n/]*f[n/]%mod;
for(int i=;i<;i++)
C=C*invf[cnt[i]]%mod; work(); int q;cin>>q;
while(q--){
char a,b;int c,d;
scanf("%d %d",&c,&d);
a=s[c-],b=s[d-];
if(a<='Z' && a>='A')
c=a-'A';
else c=a-'a'+;
if(b<='Z' && b>='A')
d=b-'A';
else d=b-'a'+; cout<<ans[c][d]*C%mod<<'\n';
}
}
01二重退背包+组合数学——cf1111d的更多相关文章
- 【Codeforces1111D_CF1111D】Destroy the Colony(退背包_组合数学)
		
题目: Codeforces1111D 翻译: [已提交至洛谷CF1111D] 有一个恶棍的聚居地由几个排成一排的洞穴组成,每一个洞穴恰好住着一个恶棍. 每种聚居地的分配方案可以记作一个长为偶数的字符 ...
 - 01退背包——bzoj2287
		
退背包就是限制某一件物品不可取的方案数 先做出无限制的方案数,然后对于当前不可取的物品,dp2[j]表示不取改物品情况下,取得体积为j的方案数 有状态方程 dp2[j]=dp1[j]-dp2[j-w[ ...
 - 01二维背包+bitset优化——hdu5890
		
口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...
 - luogu 4377 Talent show 01分数规划+背包dp
		
01分数规划+背包dp 将分式下面的部分向右边挪过去,通过二分答案验证, 注意二分答案中如果验证的mid是int那么l=mid+1,r=mid-1,double类型中r=mid,l=mid; 背包dp ...
 - BZOJ.2287.[POJ Challenge]消失之物(退背包)
		
BZOJ 洛谷 退背包.和原DP的递推一样,再减去一次递推就行了. f[i][j] = f[i-1][j-w[i]] + f[i-1][j] f[i-1][j] = f[i][j] - f[i-1][ ...
 - Codeforces 1111D(退背包、排列组合)
		
要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭.所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半. 实际情况只有52*52种,则预处理答案 枚举某两种 ...
 - Codeforces1111D Destroy the Colony 退背包+组合数
		
Codeforces1111D 退背包+组合数 D. Destroy the Colony Description: There is a colony of villains with severa ...
 - 01二维背包——poj2576
		
/* 要求把a数组分成两个集合,两个集合人数最多差1,并且元素之和的差尽可能小 那只要把所有可行的列出来即可 01二维背包,即体积是个二维数据,那么我们的背包状态也应该设为二维 dp[j][k]设为 ...
 - Codeforces 1111D Destroy the Colony 退背包 (看题解)
		
第一次知道这种背包还能退的.... 我们用dp[ i ]表示选取若干个物品重量到达 i 的方案数. 如果我们g[ i ]表示不用第 x 个物品的, 然后选若干其他的物品到达 i 的方案数. if(i ...
 
随机推荐
- express 的路由学习
			
使用步骤 - :获取路由中间件对象 `let router = express.Router();` - :配置路由规则 `router.请求方式(URL,fn事)` - fn中参数有req,res, ...
 - 【leetcode】953. Verifying an Alien Dictionary
			
题目如下: In an alien language, surprisingly they also use english lowercase letters, but possibly in a ...
 - PHP中关于Phar的学习
			
什么是phar 一个PHP程序往往是由多个文件组成的,如果能够集中为一个文件来分发和运行是很方便的.phar便应运而生.大概跟java的jar文件是差不多类似的.但是php的phar文件是可以由php ...
 - Chrome 调试跨域问题解决方案之插件篇
			
跨域,就是A域名下的js,想请求B域名下的接口数据.跨域,只存在于浏览器端.App和小程序不存在跨域问题.跨域,分浏览器策略和服务器策略. 如果服务器配置了允许跨域,那就没有跨域问题 如果uni-ap ...
 - python 内置模块--collections
			
1.计数器(counter) Counter是对字典的补充,用于追踪值出现的次数. Counter具有字典的全部属性和自己的属性. >>>import collections obj ...
 - vscode gp 安装第三方包
			
由于code.google.com被墙,导致一些托管在code.google.com上面的包go get不下来,此功能就是用于解决这个问题. http://www.golangtc.com/downl ...
 - ES数据导入导出
			
ES数据导入导出 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 ...
 - (52) C# 串口通讯
			
一.串口通讯基本参数 1.波特率:每秒传输n个多少个二进制位. 例如 9600 b/s = 1200 B/s= 1.172KB/S 2.传输数据格式 数据格式由起始位(start bit).数据位 ...
 - C# 中如何输出双引号(转义字符的使用)
			
实现效果: 输出这样的一个含有双引号的字符串 "hello" 方式一: 不用 @ 时转义 System.Console.WriteLine("\"he ...
 - 内存Zone中的pageset成员分析
			
1: struct per_cpu_pageset __percpu *pageset; 首先,分析一个函数,__free_pages,这个函数是Buddy System提供的API接口函数,用于翻译 ...