比较套路的组合数学题

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的更多相关文章

  1. 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 ...

  2. 【CF660E】Different Subsets For All Tuples 结论题

    [CF660E]Different Subsets For All Tuples 题意:对于所有长度为n,每个数为1,2...m的序列,求出每个序列的本质不同的子序列的数目之和.(多个原序列可以有相同 ...

  3. 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 ...

  4. 【CF660E】Different Subsets For All Tuples(组合数学)

    点此看题面 大致题意: 有一个长度为\(n\)的数列,每个位置上数字的值在\([1,m]\)范围内,则共有\(m^n\)种可能的数列.分别求出每个数列中本质不同的子序列个数,然后求和. 一些分析 首先 ...

  5. Codeforces 660E Different Subsets For All Tuples【组合数学】

    看了官方题解+q神的讲解才懂... 智商问题.. 讲道理..数学真的比脱单难啊... 题目链接: http://codeforces.com/problemset/problem/660/E 题意: ...

  6. Different Subsets For All Tuples CodeForces - 660E (组合计数)

    大意: 定义$f(a)$表示序列$a$本质不同子序列个数. 给定$n,m$, 求所有长$n$元素范围$[1,m]$的序列的$f$值之和. 显然长度相同的子序列贡献是相同的. 不考虑空串, 假设长$x$ ...

  7. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ

    因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...

  8. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  9. Codeforces 895.C Square Subsets

    C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...

随机推荐

  1. CompareToBuilder构建Comparator

    import org.apache.commons.lang.builder.CompareToBuilder; Collections.sort(outboundNotices, new Compa ...

  2. Scrapy(爬虫应用框架)安装配置

    运行平台:Windows Python版本:Python3.x 一.Scarpy 简介 Scrapy是一个为了爬取网站数据提取结构性数据而编写的应用框架,可以应用于数据挖掘,信息处理或存储历史数据等一 ...

  3. java——方法重载与重写、构造方法、this关键字、static关键字、strictfp关键字、类的导入

    Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用.当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错 ...

  4. JS——两个原生选择器

    1. document.querySlector() 2.document.querySlectorAll() <!DOCTYPE html> <html lang="en ...

  5. 使用Telerik StyleMananger 改变Silverlight Button样式

    Telerik 支持更改以下控件样式 System.Windows.Button System.Windows.ScrollViewer System.Windows.CheckBox System. ...

  6. Spark Mllib里的协调过滤的概念和实现步骤、LS、ALS的原理、ALS算法优化过程的推导、隐式反馈和ALS-WR算法

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 (广泛采用) 协调过滤的概念 在现今的推荐技术和算法中,最被大家广泛认可和 ...

  7. jquery字符串数组转json字符串 C#json字符串转字符串list

    一.jquery字符串数组转json字符串 var str=['1','2','3']; var jsonText= JSON.stringify(str);//把一个对象转换成json字符串 str ...

  8. 【Lua】Lua中ipair和pair的区别

    pairs会遍历table的所有键值对. 而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历.顺便说下,记忆也很简单,带i的就是根据int ...

  9. Timer控制开始、停止例子【转】

    public partial class Form1 : Form    {       static public bool flag;         public Form1()        ...

  10. 发布MVC网站的时候出现缺少WebHost等程序集问题的解决办法

    将一下几个dll 拷贝到bin文件夹下就行 链接:https://pan.baidu.com/s/17xhTdakzM_SQmOjJdZvviw 密码:c976