传送门

Time Limit: 6 Sec  Memory Limit: 128 MB
Submit: 73  Solved: 14

Description

Input

多组输入数据。

每组数据:

第一行两个整数n,r(1 <= r <= n <= 1000000)。

第二行r个不同的整数表示:集合S的一个r子集。

Output

每组数据输出一个整数表示有多少r子集小于给定的r子集。结果mod 1000000007(1e9 + 7)。

Sample Input

3 2 2 3 3 1 2

Sample Output

2 1

HINT

Source

sspa

----------------------------------------------------------------------------------------------

Solution:

对于\(S=\{1, 2, ..., n\}\)的两个r子集\(A, B,B<A\)的条件是只属于$A$或只属于$B$的元素中最小的那个元素$x$属于$B$。

因此我们可以枚举$x$,$B$中小于$x$的元素也在$A$中,大于$x$的元素可以在$(x, n]$上任意选取。

设$A$的元素为:

  \[1\le a_{1}<a_{2}<a_{3}<\dots<a_{r}\le n\]

另外设\[a_{0}=0\]

则答案为

\[\sum _{i=1}^{r}\sum_{j=a_{i-1}+1}^{a_{i}-1}\binom{n-j}{r-i}\]

容易看出这样总共要计算组合数\(0\le a_{r}-r\le n-r\)次

Implementation:

#include <bits/stdc++.h>
using namespace std; const int N(1e6+), M(1e9+);
typedef long long LL;
int a[N];
LL f[N]; int Pow(int n, int m, int p){
LL res=, t=n;
for(; m; ){
if(m&) res*=t, res%=p, m--;
else t*=t, t%=p, m>>=;
}
return res;
} int inverse(int x, int p){
return Pow(x, p-, p);
} LL C(int n, int k, int p){
if(n< || k< || n<k) return ;
return f[n]*inverse(f[k]*f[n-k]%p, p)%p;
} int main(){
f[]=;
for(int i=; i<N; i++) f[i]=f[i-]*i%M; for(int n, r; cin>>n>>r; ){
for(int i=; i<=r; i++) cin>>a[i];
sort(a, a+r+);
LL ans=;
for(int i=; i<=r; i++)
for(int j=a[i-]+; j<a[i]; j++){
ans+=C(n-j, r-i, M), ans%=M;
}
cout<<ans<<endl;
}
return ;
}

对于求和\[\sum _{i=1}^{r}\sum_{j=a_{i-1}+1}^{a_{i}-1}\binom{n-j}{r-i}\]的计算我想过依据组合恒等式

\[\binom{0}{k}+\binom{1}{k}+\binom{2}{k}+\dots+\binom{n}{k}=\binom{n+1}{k+1}\]

将里面一项\[\sum_{j=a_{i-1}+1}^{a_{i}-1}\binom{n-j}{r-i}\]合并成

\[\binom{n-a_{i-1}} {r-i+1} - \binom{n-a_{i}+1}{r-i+1}\]

但超时了,按这种算法,无论集合$A$的元素是什么,都要算$2r$次组合数,而在$r$比较大时,$2r$比$a_{r}-r$大不少,超时是必然的。对于大数据,这种看似优化了的方法反而慢很多,所以凡事不能想当然!

我还试过把式子进一步化简成$r$项,仍然超时。

总而言之,这是一道好题。

DLUTOJ 1209 字典序和r-子集的更多相关文章

  1. R子集subset

    > x<-c(6,1,2,3,NA,12) > x[x>5]    #x[5]是未知的,因此其值是否大于5也是未知的 [1]  6 NA 12 > subset(x,x& ...

  2. r子集代码实现(递归)

    #!/usr/bin/env python #coding:utf-8 SET_START = 1 SET_END = 9 SUB_LEN = 10 def r_subset(i, r, pre, a ...

  3. [经典算法] 排列组合-N元素集合的所有子集(二)

    题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目 ...

  4. R语言中知识点总结(二)

    一些函数不知道什么意思要查,看数值例子,做笔记,知道函数的功能,函数和返回值. 网页上查找关键词,巧用查找(ctrl+F) 数据读取处理,有read.table   read R-读取数据(导入csv ...

  5. XIII Open Cup named after E.V. Pankratiev. GP of Saratov

    A. Box Game 注意到局面总数不超过$50000$,而且每次操作都会改变石子的奇偶性,因此按奇偶可以将状态建成二分图,然后求出最大匹配. 如果状态数是偶数,那么先手必胜,策略就是每次走匹配边, ...

  6. 回文的范围——算法面试刷题2(for google),考察前缀和

    如果一个正整数的十进制表示(没有前导零)是一个回文字符串(一个前后读取相同的字符串),那么它就是回文.例如,数字5, 77, 363, 4884, 11111, 12121和349943都是回文. 如 ...

  7. Linux 学习笔记 4:Shell 编程

    1.简单过滤器 a. pr [OPTION] [FILE] 功能:改变文件打印格式 选项 功能 -l n 设定页面长度为n行 -w n 设定页面总宽度为n个字符(不够会被砍掉) -h str 设定页眉 ...

  8. p57商环

    1.半群满足对乘法封闭吗? 2.理想I 又不是R的子群,为什么I是R的正规子群呢? 3.~为什么对加法是同余关系? 4. 属于R,b-b属于I,为什么R作用在I上面,还属于I呢? 1.封闭 2.理想I ...

  9. bzoj 4606: [Apio2008]DNA【dp】

    写题五分钟读题两小时系列-- 看懂题的话不算难,然而我去看了大佬的blog才看懂题-- 题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k ...

随机推荐

  1. Linux 网络编程三(socket代码详解)

    //网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  2. ReactNative之style使用指南

    ReactNative中能使用的css样式有哪些呢Valid style props: [   "alignItems",   "alignSelf",   & ...

  3. Linux下如何查看tomcat是否启动

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  4. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)

    文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-httphelper-part2.html 上一节 ...

  5. SQL 语句大全

    转载:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html 经典SQL语句大全 一.基础 1.说明:创建数据库 CREATE ...

  6. 技术分析:Femtocell家庭基站通信截获、伪造任意短信

    阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...

  7. 开始学习node.js了,第一节,fs文件系统 【fs.rename】重命名文件/文件夹

    var fs=require('fs');fs.rename('c:\\a','c:\\a2',function(err){ if(err) console.log('error:'+err);}); ...

  8. Kindeditor(JSP)& 上传目录不存在

    一.基本配置 Kindeditor是一款富文本编辑器,作用跟博客园写文章用的这个编辑器一样,都是为了让文本加入各种各样的修饰元素. 使用方法如下,解压缩,把期中的ASP\NET\PHP文件夹都删除,然 ...

  9. python selenuim使用代理的方式

    一.FireFox浏览器 myProxy = "60.195.250.55:80" proxy = Proxy({ 'proxyType': ProxyType.MANUAL, ' ...

  10. (旧)子数涵数·Flash——初识ActionScript

    一.什么是AS(ActionScript) ActionScript,简称AS,中译为"动作脚本语言". 用于在Flash上实现一些光用Flash无法实现的功能. 在Flash界面 ...