随笔分类 - 组合数学
摘要:HDU 4248 题意: 给定n种颜色不同的石子,每种石头有 num[i] 个。从中取石子,问能够得到多少种不同的序列。 \[ n \leq 100,num[i]\leq 100 \] 数据范围比较小,考虑dp \[ dp[i][j]表示选前i种石头,且选的石头总数为j时的不同序列个数 \] 有转移
阅读全文
摘要:给定一个火车的入站顺序,问是否可能以规定的顺序出站。 背景实际上是卡特兰数。 可以联想到用栈和队列来模拟这一过程。 如果进栈的过程中发现和队首相同就让他出栈。 string s1, s2; int main() { int n; while (cin >> n) { cin >> s1 >> s2;
阅读全文
摘要:每个字母都有价值,A的价值是1,B的价值是2,Z的价值是26。现给定26个字母的数量,问能凑到总价值<=50的单词的方案数是多少。 注意HDU , UDH属于相同的单词。 形式上,普通型母函数用于解决多重集的组合问题, 指数型母函数用于解决多重集的排列问题。 此题用普通型母函数求解。 构造母函数 于
阅读全文
摘要:给定一个字符串,问其能通过重新排列生成多少不同的回文串。 显然只需要考虑一边就好了,考虑一边实际上就是多重集的全排列问题。 ll f[505]; void init() { f[0] = 1ll; for (int i = 1; i <= 500; i++) f[i] = f[i - 1] * i
阅读全文
摘要:可见,可以求出0-10克的重量,且方案数都是1. 此题就是用多项式相乘的原理求幂次和系数。 int c1[130]; int c2[130]; int main() { int n; while (~scanf("%d", &n)) { for (int i = 0; i <= n; i++) c1
阅读全文
摘要:计算所有线段的所有子集的复杂度的和。 复杂度:线段集合的连通块个数。 连通块:不相交的并 考虑每个线段对前 i - 1个线段的贡献,若不选,则复杂度和不变,若选,则不相交的部分会贡献 2 ^ x 的复杂度。 故每次只需计算x的大小,x的大小可以建立前缀和数组来维护。 void Put(ll x) {
阅读全文
摘要:随机在[a,b] 选取一个数,随即在[c,d]选取一个数 问 x + y 取模 p 同余 n 的概率 其实就是计数问题。关键在于如何计数可以不重不漏。 麻烦点在于分类讨论。对于这样的区间问题,先简化为0 , x 的区间。 这里用到容斥原理,第一次做这样的题,不是很容易想到。 分类讨论相对来说感觉还算
阅读全文
摘要:回忆 HDU 4135 经典题 Co-Prime 求[a,b]区间与给定素数p互质的个数。 将p质因数分解后容斥即可。 原理就是质因数的倍数就是与p不互素的数。 此题的写法: ll p[maxn]; int cnt; ll n; void init(ll m) { for (int i = 2; i
阅读全文
摘要:ll quickPower(ll a, ll b, ll m) { ll ans = 1; ll base = a; while (b) { if (b & 1) ans *= base, ans %= m; base *= base; base %= m; b >>= 1; } return an
阅读全文
摘要:给定N,A,B N个盒子,A个红球,B个蓝球 。 可以随便放进盒子里。(可以不放) 问有几种放法。 放法 = A的方法 * B的放法 A 的放法 = C(N,1) + C(N+1,2) +..... B的放法同理 注意开ull long long C[40][40]; void get_C(int
阅读全文
摘要:题意:给出N个物品及每次获得第i个物品的概率 问获得所有物品的次数的期望、 从简单考虑 若只有一个物品 获得一个物品的期望是1/p (1/p * p = 1) 这样可以推理得到 E1 = 1 / p1 , E2 = 1/ p2 , E12 = 1 / (p1+p2) (即获得第一个物品或第二个物品的
阅读全文
摘要:第一做容斥原理,开始真的不太好理解 题意:给出a,b<=1e19 n<=1e9 ,问[a,b]中与n互质的个数 考虑[a,b]中与n不互质的个数,对n唯一分解定理,与n不互质的个数即为n/p,但是考虑到会有重复,且若数字个数是奇数则要+,偶数减去,因此借助二进制遍历每一种情况(极其神奇的思想) 代码
阅读全文
摘要:易得知 答案为 对于方程 2x+y=n的每个正整数解的 关于x,y的全排列,这里用到全排列公式 由于答案会很大 ,考虑java高精度 import java.util.*; import java.math.*; public class Main { public static void main
阅读全文
摘要:java可做 先用C++打出表发现如下规律: 若n对应答案为x ,则下一个不同答案对应的n为x+1 不同答案的递推关系有 f[n]=4*f[n-1]-f[n-2] ,因此可java秒 import java.util.Scanner; import java.math.BigInteger; pub
阅读全文
摘要:long long f[25]; int main() { f[0] = 1; cin >> n; for (int i = 1; i <= n; i++) f[i] = f[i - 1] * (4 * i - 2) / (i + 1); //这里用的是常见公式2 cout << f[n] << e
阅读全文
摘要:勘误: 多重集的组合 (1) (2) 答案应为C(n+r-1,r-1)
阅读全文

浙公网安备 33010602011771号