比较套路的组合数学题

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. jquery $.fn $.fx 的意思以及使用

    $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效,下面简单为大家介绍下jquery $.fn $.fx到底是怎么一回事 $.fn是指jquery的命名空间,加 ...

  2. 为什么要问Servlet的初始化时间

    Servlet的init方法到底是在什么时候调用的? j2ee specification和java doc中有以下说明 如果load-on-startup设置为>=0, 部署的时候就会调用.  ...

  3. @async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的. spring 在扫描bean的 ...

  4. Sorted Subsegments

    https://www.hackerrank.com/contests/101hack38/challenges/sorted-subsegments/problem 首先要注意到可以二分答案,比如当 ...

  5. Python 魔术方法及调用方式

    魔术方法 调用方式 解释 __new__(cls [,...]) instance = MyClass(arg1, arg2) __new__ 在创建实例的时候被调用 __init__(self [, ...

  6. Java匹马行天下之JavaWeb核心技术——JSP

    JSP动态网页技术 一.JavaWeb简介 一.什么是JavaWeb? JavaWeb是用Java技术来解决相关web互联网领域的技术总称. 需要在特定的web服务器上运行,分为web服务器和web客 ...

  7. AngularJs在ng-click函数中如何获取代表当前元素的DOM对象

    <!DOCTYPE html> <html> <head> <title></title> <script src="lib ...

  8. Javascript Functions

    Javascript 全局对象 全局属性和函数可用于所有内建的Javascript对象 顶层函数(全局函数) decodeURI()解码某个编码的URI. decodeURIComponent()解码 ...

  9. css动画-小球撞壁反弹

    小球碰到一面壁之后一般都会反弹,反射角=入射角: 其实用css3来实现这个效果也非常简单. 首先,分解一下小球的运动:水平运动和垂直运动. 当小球往右下方向运动时,如果碰到了下面的壁,那么由于碰撞,小 ...

  10. 【MFC】获取文件大小的方法

    [转载]原文地址:http://blog.csdn.net/coderwu/article/details/5652056 MFC 下可以通过 CFileStatus 获取文件大小. ULONGLON ...