【组合数学】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 ...
随机推荐
- ng2学习--pipe使用
We use our custom pipe the same way we use built-in pipes.(自定义Pipe和API里自带的Pipe使用方式一致) We must includ ...
- C# AD 验证登陆
using System.DirectoryServices; using System.DirectoryServices.AccountManagement; using (DirectoryEn ...
- Collections.copy
List<String> names = Arrays.asList(new String[nameList.size()]); Collections.copy(names, nameL ...
- Docker从入门到实战(三)
Docker从入门到实战(三) 一:安装Docker 1. linux系统脚本安装 Docker基于linux容器技术,面向服务器端,Docker只能安装运行在64位计算机上(社区有对32位的支持), ...
- Java对日期Date类进行加减运算一二三
转载大神 https://blog.csdn.net/hacker_lees/article/details/74351838
- sql新增字段注意事项
新增字段的类型.长度(精度)是否合适 解决方法: 跟应用明确加字段和改字段的风险,确认新增字段类型正确.长度(精度)合适. 以及跟应用明确老数据是否要订正?如何订正?新增列是否非空?是否有默认值等等. ...
- Oozie安装的说明
不多说,直接干货! Oozie相当于Hadoop的一个客户端,因此集群中要有一台机器部署Oozie server端即可,由于可以有任意多个客户端连接Oozie,故每个客户端都必须部署Oozie cli ...
- bash和zsh切换
zsh切换bash bash切换zsh 切换bash chsh -s /bin/bash 切换zsh chsh -s /bin/zsh
- kolla-ansible-----rally模块
Rally简介 Rally是OpenStack社区推出开源测试工具,可用于对OpenStack各个组件进行性能测试. 通过使用Rally组件,用户可完成OpenStack云计算平台的安装部署.功能验证 ...
- 深入V8引擎-Time核心方法之win篇(2)
这一篇讲windows系统下TimeTicks的实现. 对于tick,V8写了相当长的一段discussion来讨论windows系统上计数的三种实现方法以及各自的优劣,注释在time.cc的572行 ...