比较套路的组合数学题

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. mysql隔离级别与锁,接口并发响应速度的关系(2)

    innoDB默认隔离级别 mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-------------- ...

  2. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  3. UnityError 动画系统中anystate跳转重复播放当前动画解决方案

  4. Spark Mllib里的如何对单个数据集用斯皮尔曼计算相关系数

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...

  5. POJ 1797 ——Heavy Transportation——————【最短路、Dijkstra、最短边最大化】

    Heavy Transportation Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64 ...

  6. <Openssl下hash函数>

    hash函数:是不可逆的函数,它的输入可以是任意长度的字节流.它的输出是固定大小的,hash函数的作用就是给你的文件产生一个摘要,它是独一无二的. 例如:y=f(x) x代表输入  y代表输出   输 ...

  7. Authentication to host '***‘' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.

    如下场景: 一个页面中需要用户填入文字信息,并上传图片,上传图片是单独调用上传文件接口的,当用户上传图片后,马上点保存,就会报错. Authentication to host '***‘' for ...

  8. mysql通过event和存储过程实时更新简单Demo

    今天想稍微了解一下存储过程和EVENT事件,最好的方法还是直接做一个简单的demo吧 首先可以在mysql表中创建一个users表 除了设置一些username,password等必要字段以外还要设立 ...

  9. 命名空间namespace、smarty使用(视图分离,MVC)、smarty模板语法、smarty缓存、MVC模式

    一.命名空间:namespace 命名空间 可以理解为逻辑上的使用,为了防止重名 namespace :关键字 加载:require_once();//加载一次 include_once() 申明命名 ...

  10. android sqlite 递归删除一棵子树

    背景:android studio 3.0 GreenDao 目标:在android 中,如何做到递归删除某颗子树?? ======================================== ...