第一次知道这种背包还能退的。。。。

我们用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 退背包 (看题解)的更多相关文章

  1. Codeforces1111D Destroy the Colony 退背包+组合数

    Codeforces1111D 退背包+组合数 D. Destroy the Colony Description: There is a colony of villains with severa ...

  2. CF - 1111D Destroy the Colony DP

    题目传送门 题意: 这个题目真的是最近遇到的最难读. 有一个长度n的字符串,每一位字符都代表的是该种种类的敌人. 现在如果一个序列合法的话,就是同一种种类的敌人都在字符串的左半边或者右半边. 现在有q ...

  3. Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)

    Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...

  4. Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)

    Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...

  5. Codeforces 498B Name That Tune 概率dp (看题解)

    Name That Tune 刚开始我用前缀积优化dp, 精度炸炸的. 我们可以用f[ i ][ j ] 来推出f[ i ][ j + 1 ], 记得加加减减仔细一些... #include<b ...

  6. 【Codeforces1111D_CF1111D】Destroy the Colony(退背包_组合数学)

    题目: Codeforces1111D 翻译: [已提交至洛谷CF1111D] 有一个恶棍的聚居地由几个排成一排的洞穴组成,每一个洞穴恰好住着一个恶棍. 每种聚居地的分配方案可以记作一个长为偶数的字符 ...

  7. Codeforces 1111D(退背包、排列组合)

    要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭.所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半. 实际情况只有52*52种,则预处理答案 枚举某两种 ...

  8. 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][ ...

  9. [CF1111D]Destroy the Colony

    题目大意:有一个长度为$n(n\leqslant10^5,n=0\pmod2)$的字符串,字符集大小为$52$,有$q(q\leqslant10^5)$次询问,每次询问第$x,y$个字符在这个字符串的 ...

随机推荐

  1. jmeter设置全局变量

    2017年4月20日 10:07:37 星期四 情景, 从第一个请求的结果中匹配出code, 当作参数去做下次请求 以抢红包为例: 1. 创建红包, 并从返回结果中获取红包code 2. 将code设 ...

  2. python学习第9-10天,函数。

    函数初识 为什么要使用函数? 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 函数的定义与 ...

  3. Go斐波拉契数列(Fibonacci)(多种写法)

    1 前言 斐波拉契数列有递归写法和尾递归和迭代写法. 2 代码 //recursion func fib(n int) int{ if n < 2{ return n }else{ return ...

  4. springboot第一个项目【mybatis】

    1.resources下添加spring 添加spring-context.xml,设置controller的路径,以及引入数据库配置 <beans xmlns="http://www ...

  5. nginx安装编译参数

  6. day34 基于TCP和UDP的套接字方法 粘包问题 丢包问题

    TCP 基于流的协议 又叫可靠性传输协议 通过三次握手 四次挥手 来保证数据传输完毕 缺点效率低 正因为是基于流的协议 所以会出现粘包问题粘包问题:原因一:是应为数据是先发送给操作系统,在操作系统中有 ...

  7. DSB

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  8. 波哥博客Url

    http://www.cnblogs.com/whatlonelytear/

  9. node.js 的页面渲染方法ejs

    .安装依赖的组件 npm i consolidate -D npm i ejs -D 2.布局服务端 const express = require('express'); const consoli ...

  10. python基础复习

    复习-基础 一.review-base 其他语言吗和python的对比 c vs Python c语言是python的底层实现,解释器就是由python编写的. c语言开发的程序执行效率高,开发现率低 ...