Codeforces 660E Different Subsets For All Tuples【组合数学】
2016-04-12 12:33
597 查看
看了官方题解+q神的讲解才懂。。。
智商问题。。
讲道理。。数学真的比脱单难啊。。。
k=0时,ans=mn
k≥1时,设序列元素为x1,x2,x3...xk,为了避免重复,我们假设当前位置是第一次出现xi,即要求x1之前的元素不会出现x1,x1和x2之间的元素不会出现x2,依次类推,每个间隔中的每个元素都为m−1种。
最后枚举xk结束的位置,即xk后面的元素个数j,这些元素每个有m种可能。由于我们枚举了xk的位置,那么前k−1个元素的位置就有(n−j−1k−1)种。
这样对于每个k,我们可以得到公式:∑j=0n−kmkmj(m−1)n−j−k(n−j−1k−1)
令s=n−j,则有
∑k=1n∑s=knmkmn−s(m−1)s−k(s−1k−1)
(交换求和)=∑s=1n∑k=1smkmn−s(m−1)s−k(s−1k−1)
后一项求和利用二项式定理进行化简,最终得到=∑s=1nmn−s+1∗(2m−1)s−1
然后可以发现这个就是个等比数列。
最后不要忘记加上空串的mn。
智商问题。。
讲道理。。数学真的比脱单难啊。。。
题目链接:
http://codeforces.com/problemset/problem/660/E题意:
给定数字范围,问由这些数字组成的长度为n的串的子序列有多少种?分析:
方法一:
枚举长度k,计算以其为子序列的原串种数。k=0时,ans=mn
k≥1时,设序列元素为x1,x2,x3...xk,为了避免重复,我们假设当前位置是第一次出现xi,即要求x1之前的元素不会出现x1,x1和x2之间的元素不会出现x2,依次类推,每个间隔中的每个元素都为m−1种。
最后枚举xk结束的位置,即xk后面的元素个数j,这些元素每个有m种可能。由于我们枚举了xk的位置,那么前k−1个元素的位置就有(n−j−1k−1)种。
这样对于每个k,我们可以得到公式:∑j=0n−kmkmj(m−1)n−j−k(n−j−1k−1)
令s=n−j,则有
∑k=1n∑s=knmkmn−s(m−1)s−k(s−1k−1)
(交换求和)=∑s=1n∑k=1smkmn−s(m−1)s−k(s−1k−1)
后一项求和利用二项式定理进行化简,最终得到=∑s=1nmn−s+1∗(2m−1)s−1
代码:
#include <iostream> using namespace std; const int mod = 1e9 + 7; int quick_pow(int a, int b) { int ans = 1; for(;b;b >>= 1, a = a * 1ll * a % mod){ if(b & 1) ans = ans * 1ll * a % mod; } return ans; } int main() { int n, m;cin>>n>>m; int ans = quick_pow(m, n); for(int s = 1; s <= n; s ++) ans = (ans + quick_pow(m, n - s+ 1) * 1ll * quick_pow( 2 * m - 1, s - 1)) % mod; cout<<ans<<endl; return 0; }
然后可以发现这个就是个等比数列。
最后不要忘记加上空串的mn。
#include <iostream> using namespace std; const int mod = 1e9 + 7; int quick_pow(int a, int b) { int ans = 1; for(;b;b >>= 1, a = a * 1ll * a % mod){ if(b & 1) ans = ans * 1ll * a % mod; } return ans; } int main() { int n, m;cin>>n>>m; int ans ; if(m == 1) ans = n + 1; else ans = (quick_pow(m, n) + m * 1ll * (quick_pow(2 * m - 1, n) - quick_pow(m, n)) % mod * quick_pow(m - 1, mod - 2) % mod) % mod; cout<<ans<<endl; return 0; }
方法二:
还有一种卿学姐的dp方法。。相关文章推荐
- ajaxFileUpload 异步上传文件简单使用
- 一个Java码农的Node之旅
- 剑指Offer--012-打印1到最大的N位数
- JQuery中bind和unbind函数
- C#颜色和名称样式对照表
- jsp九大内置对象
- 关于“时间”的一次探索 关于js时区iso,utc等完美解答
- 献给和我合作的过得前端童靴们:jquery源码分析--核心函数(使用函数作为参数创建jQuery对象)
- jsp(2)
- 理解 JavaScript 中的 Function.prototype.bind
- node学习笔记
- CSS box-flex属性,然后弹性盒子模型简介
- Koajs原理
- Bootstrap 3 管理模板
- 高性能I/O设计模式Reactor和Proactor
- 深入理解CSS线性渐变linear-gradient
- 五种js判断是否为整数类型方式
- html5生成柱状图(条形图)
- HTML5中Access-Control-Allow-Origin解决跨域问题
- golang json 处理