Codeforces 1111D Destroy the Colony 退背包 (看题解)
第一次知道这种背包还能退的。。。。
我们用dp[ i ]表示选取若干个物品重量到达 i 的方案数。
如果我们g[ i ]表示不用第 x 个物品的, 然后选若干其他的物品到达 i 的方案数。
if(i < cnt[ x ]) g[ i ] = dp[ i ]
else g[ i ] = dp[ i ] - g[ i - cnt[ x ] ]
这样退一次就能删一个物品, 这个题目退两次就可以了。
一共只有52 × 52 / 2个本质不同的询问, 预处理一下。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = ;
const double eps = 1e-;
const double PI = acos(-); int n, m, q, way, c[];
int dp[N], f[N], g[N], ans[][];
char s[N];
int F[N], Finv[N], inv[N]; int getPos(char x) {
if(islower(x)) return x - 'a';
else return x - 'A' + ;
} void add(int &a, int b) {
a += b; if(a >= mod) a -= mod;
} void init() {
inv[] = F[] = Finv[] = ;
for(int i = ; i < N; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
for(int i = ; i < N; i++) F[i] = 1ll * F[i - ] * i % mod;
for(int i = ; i < N; i++) Finv[i] = 1ll * Finv[i - ] * inv[i] % mod;
} int main() {
init();
scanf("%s", s + );
n = strlen(s + );
for(int i = ; i <= n; i++)
c[getPos(s[i])]++;
m = n / ;
way = 1ll * F[m] * F[m] % mod;
for(int i = ; i < ; i++)
way = 1ll * way * Finv[c[i]] % mod;
dp[] = ;
for(int i = ; i < ; i++) {
if(!c[i]) continue;
for(int j = n - c[i]; j >= ; j--)
add(dp[j + c[i]], dp[j]);
}
for(int u = ; u < ; u++) {
for(int v = u + ; v < ; v++) {
if(!c[u] || !c[v]) continue;
for(int i = ; i <= n; i++) {
if(i < c[u]) f[i] = dp[i];
else {
f[i] = dp[i] - f[i - c[u]];
if(f[i] < ) f[i] += mod;
}
if(i < c[v]) g[i] = f[i];
else {
g[i] = f[i] - g[i - c[v]];
if(g[i] < ) g[i] += mod;
}
}
ans[u][v] = * g[m] % mod;
}
}
scanf("%d", &q);
while(q--) {
int x, y; scanf("%d%d", &x, &y);
x = getPos(s[x]), y =getPos(s[y]);
if(x > y) swap(x, y);
if(x == y) {
printf("%d\n", 1ll * dp[m] * way % mod);
} else {
printf("%d\n", 1ll * ans[x][y] * way % mod);
}
}
return ;
} /*
*/
Codeforces 1111D Destroy the Colony 退背包 (看题解)的更多相关文章
- Codeforces1111D Destroy the Colony 退背包+组合数
Codeforces1111D 退背包+组合数 D. Destroy the Colony Description: There is a colony of villains with severa ...
- CF - 1111D Destroy the Colony DP
题目传送门 题意: 这个题目真的是最近遇到的最难读. 有一个长度n的字符串,每一位字符都代表的是该种种类的敌人. 现在如果一个序列合法的话,就是同一种种类的敌人都在字符串的左半边或者右半边. 现在有q ...
- Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)
Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...
- Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...
- Codeforces 498B Name That Tune 概率dp (看题解)
Name That Tune 刚开始我用前缀积优化dp, 精度炸炸的. 我们可以用f[ i ][ j ] 来推出f[ i ][ j + 1 ], 记得加加减减仔细一些... #include<b ...
- 【Codeforces1111D_CF1111D】Destroy the Colony(退背包_组合数学)
题目: Codeforces1111D 翻译: [已提交至洛谷CF1111D] 有一个恶棍的聚居地由几个排成一排的洞穴组成,每一个洞穴恰好住着一个恶棍. 每种聚居地的分配方案可以记作一个长为偶数的字符 ...
- Codeforces 1111D(退背包、排列组合)
要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭.所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半. 实际情况只有52*52种,则预处理答案 枚举某两种 ...
- 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][ ...
- [CF1111D]Destroy the Colony
题目大意:有一个长度为$n(n\leqslant10^5,n=0\pmod2)$的字符串,字符集大小为$52$,有$q(q\leqslant10^5)$次询问,每次询问第$x,y$个字符在这个字符串的 ...
随机推荐
- 计算机基础+python安装注意问题+python变量介绍
1.什么是编程语言语言是一个事物与另外一个事物沟通的介质编程语言是程序员与计算机沟通的介质 2.什么是编程编程就是程序按照某种编程语言的语法规范将自己想要让计算机做的事情表达出来表达的结果就是程序,程 ...
- Python-Mongodb vs mysql
mongodb https://www.cnblogs.com/kermitjam/articles/10147254.html#_label5 centos安装mongodb: https://bl ...
- npm i 和 npm install 的区别
实际使用的区别点主要如下(windows下): 1. 用npm i安装的模块无法用npm uninstall删除,用npm uninstall i才卸载掉 2. npm i会帮助检测与当前node版本 ...
- 自然语言处理之关键词提取TF-IDF
统计每篇文章重要的词作为这篇文章的关键词,用tf-idf来实现.生产中有很多第三包可以调用,这里记录原理,顺便熟练python 1.公式 : 计算词频TF 考虑到文章有长短之分,为了便于不同文章的比较 ...
- python 启动虚拟环境
假设你有两个Python项目-A和B,这两个项目都需要使用同一个第三方模块-tensorflow.如果这两个项目使用相同的tensorflow版本,也许不会有什么问题. 但是,当A和B项目使用不同的t ...
- Confluence 6 配置字符集编码
Confluence 和你的数据库必须配置使用相同的字符集.为了避免字符出现问题,请将所有的字符集设置为使用 UTF-8 编码(或者根据你配置的数据库来制定正确的 UTF-8 编码字符集,例如在 Or ...
- clock gen sdk 代码笔记
int ClockConfig(void) { u32 DIVCLK_DIVIDE = 10; u32 CLKFBOUT_MULT = 53; u32 CLKFBOUT_FRAC = 625; u32 ...
- 在anaconda中安装tensorflow
打开Anaconda Prompt, step1: 输入清华仓库镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...
- JavaScript实现的抛物线运动效果
css88 技术文档地址: http://www.css88.com/archives/5355 张鑫旭 技术文档地址: https://www.zhangxinxu.com 使用示例: 使用时直接引 ...
- Pycharm同步本地代码至GitHub
注册github账号 github地址,进入注册账号 安装git Windows下载地址1 Windows下载地址2 在官方下载完后,双击exe文件进行安装,安装到Windows Explorer i ...