DLUTOJ 1209 字典序和r-子集
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
Sample Output
HINT
Source
----------------------------------------------------------------------------------------------
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-子集的更多相关文章
- R子集subset
> x<-c(6,1,2,3,NA,12) > x[x>5] #x[5]是未知的,因此其值是否大于5也是未知的 [1] 6 NA 12 > subset(x,x& ...
- r子集代码实现(递归)
#!/usr/bin/env python #coding:utf-8 SET_START = 1 SET_END = 9 SUB_LEN = 10 def r_subset(i, r, pre, a ...
- [经典算法] 排列组合-N元素集合的所有子集(二)
题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目 ...
- R语言中知识点总结(二)
一些函数不知道什么意思要查,看数值例子,做笔记,知道函数的功能,函数和返回值. 网页上查找关键词,巧用查找(ctrl+F) 数据读取处理,有read.table read R-读取数据(导入csv ...
- XIII Open Cup named after E.V. Pankratiev. GP of Saratov
A. Box Game 注意到局面总数不超过$50000$,而且每次操作都会改变石子的奇偶性,因此按奇偶可以将状态建成二分图,然后求出最大匹配. 如果状态数是偶数,那么先手必胜,策略就是每次走匹配边, ...
- 回文的范围——算法面试刷题2(for google),考察前缀和
如果一个正整数的十进制表示(没有前导零)是一个回文字符串(一个前后读取相同的字符串),那么它就是回文.例如,数字5, 77, 363, 4884, 11111, 12121和349943都是回文. 如 ...
- Linux 学习笔记 4:Shell 编程
1.简单过滤器 a. pr [OPTION] [FILE] 功能:改变文件打印格式 选项 功能 -l n 设定页面长度为n行 -w n 设定页面总宽度为n个字符(不够会被砍掉) -h str 设定页眉 ...
- p57商环
1.半群满足对乘法封闭吗? 2.理想I 又不是R的子群,为什么I是R的正规子群呢? 3.~为什么对加法是同余关系? 4. 属于R,b-b属于I,为什么R作用在I上面,还属于I呢? 1.封闭 2.理想I ...
- bzoj 4606: [Apio2008]DNA【dp】
写题五分钟读题两小时系列-- 看懂题的话不算难,然而我去看了大佬的blog才看懂题-- 题目大意是:一个原字符串,其中有一种通配符,合法串的定义是这个串(不含通配符))可以匹配原串并且这个串最多分成k ...
随机推荐
- CSS3实现几个常用的网页小效果
主题 由于最近比较忙,自己也没有很充裕的时间可以去做比较丰富的分享.今晚我挤出时间来制作这几个很常用的CSS3网页小效果.最近写JS的时间比例比较多,不过我还是比较钟情于CSS3.所以我还是坚持分享一 ...
- JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
JavaScript Number 对象 Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用. MAX_VALUE 可表示的最大的数. MIN_V ...
- javascript中的array对象属性及方法
Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, e ...
- 11Mybatis_mybatis开发Dao的方法
在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...
- Linux 网络编程六(socket通信UDP版)
//udp接收消息 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- U3D协程Coroutine之WWW与Update()的并行测试
using System.Collections; using UnityEditor; using UnityEngine; using UnityEngine.UI; /************* ...
- C# 与 Unity 同名函数
1,Random,直接使用Random会报错,要么使用UnityEngine.Random,要么使用System.Random
- JS面向对象的几种写法
JS 中,面向对象有几种写法.归纳下,大概有下面这几种:工厂模式,构造函数模式,原型模式,构造函数与原型模式的混合使用,原型链继承,借用构造函数继承. 一.工厂模式 function person ( ...
- 深入了解view以及自定义控件
参考文章: http://blog.csdn.net/guolin_blog/article/details/12921889 Android LayoutInflater原理分析,带你一步步深入了解 ...
- iOS后台定位实现
iOS后台定位实现 (2013-01-24 16:43:12) 工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置. 苹果对iOS的规范性在提升了app的品质的同时也 ...