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 ...
随机推荐
- eclipse的使用-------Text File Encoding没有GBK选项的设置
eclipse的使用-------Text File Encoding没有GBK选项的设置 2013-12-25 09:48:06 标签:java myeclipse使用 有一个项目是使用GBK编码的 ...
- action中result没有值
action中result没有值,访问action会输出action中的所有数据,输出类型为.action类型 .
- poj 3352
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11215 Accepted: 5575 De ...
- 04SpringMvc_映射器_BeanNameUrlHanderMapping
这篇文章我们讲的是映射器,映射器的作用是什么样的请求交给Action,如果我们没有在xml配置文件中进行配置,默认的就是BeanNameUrlHanderMapping. 我们讲一个案例增加用户的案例 ...
- usb驱动开发6之端点描述符
学到这里不容易,先说一段故事吧. 二兄弟住一大楼的第80层,某深夜回家忘看通知(内容今夜停电). 兄弟俩背着沉重的大背包,在楼底下商量一下,决定一鼓作气,爬楼梯回家.两人抖擞精神,开始爬楼.爬到20楼 ...
- 【转】【WPF】资源读取 URI
一开始看到WPF里面经常用如下语句来构造资源文件Uri: Uri uri = new Uri("/AssemblyName;component/image.png"); 我还以为这 ...
- 给vps设置ssh供爬墙使用
在服务器上建一个 username : 添加用户:useradd -s /bin/false username,将用户的shell设置成/bin/false.这样用户就无法与系统进行交互. 设置密码: ...
- Oracle11G 7个服务说明
中的方法成功安装Oracle 11g后,共有7个服务, 这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volu ...
- WorldWind源码剖析系列:BMNG类构造函数深入分析
BMNG构造函数深入分析 一.主要类图 二.主要功能: 1) BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...
- php基础08:改变数据类型
<?php //1.获取数据类型 $num = 55; echo gettype($num); //integer //2.设置数据类型 settype($num, "string&q ...