【组合数学】cf660E. Different Subsets For All Tuples
比较套路的组合数学题
For a sequence a of n integers between 1 and m, inclusive, denote f(a) as the number of distinct subsequences of a (including the empty subsequence).
You are given two positive integers n and m. Let S be the set of all sequences of length n consisting of numbers from 1 to m. Compute the sum f(a) over all a in S modulo 109 + 7.
Input
The only line contains two integers n and m (1 ≤ n, m ≤ 106) — the number of elements in arrays and the upper bound for elements.
Output
Print the only integer c — the desired sum modulo 109 + 7.
题目大意
一个长度为 $N$ 的数列,每个位置上的数字可以是$[1,M]$,这样的数列一共有$M^N$个。对于$M^N$这个数列,求其本质不同的子序列个数之和。答案对 $P$ 取模。
$1≤N,M≤10^6,2≤P≤10^9+7$,保证 $P$ 是质数。
题目分析
正经推式子
首先注意到对于长度相同的子序列,它们在答案中的贡献是相同的。那么问题变为了计算$f_i$:长度为$i$的子序列对答案的贡献。
为了保证不算重贡献,我们所求的子序列必须是在全数列中唯一出现一次的方案。也就是说,设长为$i$的子序列是${a_1,a_2\cdots a_i}$,那么$a_1$之前不能出现$a_1$;$a_1\cdots a_2$之间不能出现$a_2$;$\cdots$以此类推。从最基础的式子考虑起:枚举一个数$j$为长度为$i$的子序列在序列中的结束位置。则有:
$\sum f_i=\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{n}m^i{j-1\choose i-1}m^{n-j}(m-1)^{j-i}$
其中,$m^i$表示这个长度为$i$的序列有几种本质不同的方案数;${j-1\choose i-1}$表示除了强制固定在$j$位的最后一个数字,剩下的可在前$j-1$中任意选取;$m^{n-j}$表示$j+1\cdots n$的位置可以任意排列数字;$(m-1)^{j-i}$表示前$j-i$位置由于有且仅有一次我们所强制的子序列,那么每个位置只能安排$m-1$个数。
按照常规套路,把$i,j$的两重循环互换位置:
$\sum f_i=\sum\limits_{j=1}^{n}\sum\limits_{i=1}^{j}{j-1\choose i-1}m^{n-j+i}(m-1)^{j-i}$
注意到后一部分是一个类似二项式展开的形式,因此把$i$改为$0\cdots j-1$的循环。
$\sum f_i=\sum\limits_{j=1}^{n}m^{n-j+1}\sum\limits_{i=0}^{j-1}{j-1\choose i}m^i(m-1)^{j-i-1}$
$\sum f_i=\sum\limits_{j=1}^{n}m^{n-j+1}(2m-1)^{j-1}$
那么所求答案就是$ans=\sum f_i+M^N$.因此可以使用$O(n\log n)$或$O(n)$的复杂度通过此题。
#include<bits/stdc++.h>
#define MO 1000000007 int n,m;
long long ans; int qmi(int a, int b)
{
int ret = ;
for (; b; b>>=, a=1ll*a*a%MO)
if (b&) ret = 1ll*ret*a%MO;
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; i++)
ans = (ans+1ll*qmi(m, n-i+)*qmi(*m-, i-)%MO)%MO;
printf("%lld\n",(ans+1ll*qmi(m, n))%MO);
return ;
}
关于找规律的技巧
考虑答案大概是一个$ans=\sum\limits_{i=1}^n k_1(m+a)k_2(2m+b)k_3(m^2+c)\cdots$的形式。
那么就依据暴力来观察答案。
当然前提条件是暴力写得又快又准……
END
【组合数学】cf660E. Different Subsets For All Tuples的更多相关文章
- cf660E Different Subsets For All Tuples
For a sequence a of n integers between 1 and m, inclusive, denote f(a) as the number of distinct sub ...
- 【CF660E】Different Subsets For All Tuples 结论题
[CF660E]Different Subsets For All Tuples 题意:对于所有长度为n,每个数为1,2...m的序列,求出每个序列的本质不同的子序列的数目之和.(多个原序列可以有相同 ...
- Educational Codeforces Round 11 E. Different Subsets For All Tuples 动态规划
E. Different Subsets For All Tuples 题目连接: http://www.codeforces.com/contest/660/problem/E Descriptio ...
- 【CF660E】Different Subsets For All Tuples(组合数学)
点此看题面 大致题意: 有一个长度为\(n\)的数列,每个位置上数字的值在\([1,m]\)范围内,则共有\(m^n\)种可能的数列.分别求出每个数列中本质不同的子序列个数,然后求和. 一些分析 首先 ...
- Codeforces 660E Different Subsets For All Tuples【组合数学】
看了官方题解+q神的讲解才懂... 智商问题.. 讲道理..数学真的比脱单难啊... 题目链接: http://codeforces.com/problemset/problem/660/E 题意: ...
- Different Subsets For All Tuples CodeForces - 660E (组合计数)
大意: 定义$f(a)$表示序列$a$本质不同子序列个数. 给定$n,m$, 求所有长$n$元素范围$[1,m]$的序列的$f$值之和. 显然长度相同的子序列贡献是相同的. 不考虑空串, 假设长$x$ ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- 2019.03.14 ZJOI2019模拟赛 解题报告
得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...
- Codeforces 895.C Square Subsets
C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...
随机推荐
- Leetcode初级算法(排序和搜索+数学篇)
合并两个有序数组 开始的时候将这道题理解错了,发现几个奇怪的测试案例后才明白这道题什么意思.本来的想法就是把nums2全部放到num1里面,然后删除重复元素.排序一下,就有了下面的代码: class ...
- haoi2018奇怪的背包题解
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p ...
- php与MySQL与echart综合使用
http://www.yinghualuowu.com/php/echart.html 创建table sex 有name num <?php ini_set('disp ...
- 装饰器(Decorator)模式
public interface IDoThings { public void doSomeThing(); } public class DoThings implements IDoThings ...
- 010 Regular Expression Matching 正则表达式匹配
Implement regular expression matching with support for '.' and '*'.'.' Matches any single character. ...
- c++概念字符串操作 (转)
本文转自:http://www.jb51.net/article/37410.htm 一.char_traits 字符特征类 1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息而执行特 ...
- Spring事务管理的xml方式
一个业务的成功: 调用的service是执行成功的,意味着service中调用的所有的dao是执行成功的. 事务应该在Service层统一控制. 如果手动去实现,则需要对dao进行代理,在方法前后进 ...
- JAVA 集合类小结
一 集合和数组 因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的. 说到集合,必须了解数组和集合. Java的数组长度固定,集合长度不定.集合是特定的数据结构的集合. 而go里面并没有集合, ...
- js对secure的支持是没问题的,httponly是为限制js而产生的,当然httponly的cookie也不会被js创建
function setCookie4(c_name,value,expiredays){ var cookieStr = ""; var exdate=new Date(); e ...
- VS2017无法进入断点调试且移动到breakpoint上的时候报错“breakpoint will not currently be hit. the source code is different from original version. ”
我尝试了网上的很多其他办法也翻阅了很多外网资源,这些方法并不能解决我的问题 当然我非常震惊正当我尝试着在stack overflow上发表评论交流一下究竟如何解决的时候,却发现有方法灵验了 ,但是每个 ...