CodeChef - LEMOVIE Little Elephant and Movies
Read problems statements in Mandarin Chineseand Russian.
Little Elephant from Zoo of Lviv likes to watch movies.
There are N different movies (numbered from 0 to N − 1) he wants to watch in some order. Of course, he will watch each movie exactly once. The priority of ith movie is Pi.
A watching of a movie is called exciting if and only if one of the following two conditions holds:
- This is the first watching.
- The priority of this movie is strictly greater than the maximal priority of the movies watched so far.
Let us call the number of exciting watchings the excitingness of the order.
Help him to find the number of different watching orders whose excitingness does not exceed K. Since the answer can be large, print it modulo 1000000007 (109+7).
Input
The first line of input contains an integer T, denoting the number of test cases. Then T test cases follow.
The first line of each test case contains two space-separated integers N and K. The next line contains N space-separated integers P1, P2, ..., PN.
Output
For each test case, print the number of different watching orders having at most Kexcitingness modulo 1000000007 (109+7).
Constraints
- 1 ≤ T ≤ 10
- 1 ≤ K ≤ N ≤ 200
- 1 ≤ Pi ≤ 200
Example
Input:
2
3 1
3 1 2
4 3
1 2 2 3 Output:
2
24
Explanation
In the first case, there are two boring watching orders whose excitingness not greater than K=1: [3, 1, 2], [3, 2, 1]. Both watching orders have one excitingwatching: the first watching.
In the second case, every watching order has at most 3 excitingness.
一般的排列问题都可以转化成把元素以一定顺序插入进序列来做。这个题如果按照升序来插入的话,后插入的元素会挡住前面插入的元素,没法算;
而如果按照降序插入的话,影响是很好计算的:插入的元素不会挡住前面的,而且只有放在最前面会对 激动值 +1。
有很多重复的元素的话,我们就可重集组合一下,不过对激动值的 影响最大还是1,因为相同元素也会挡住。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=405;
const int ha=1000000007;
int jc[maxn],ni[maxn],T,n,k;
int dp[maxn],num[maxn],N,f[maxn]; inline int add(int x,int y){
x+=y;
return x>=ha?x-ha:x;
} inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
} inline void getC(){
jc[0]=1;
for(int i=1;i<=400;i++) jc[i]=jc[i-1]*(ll)i%ha;
ni[400]=ksm(jc[400],ha-2);
for(int i=400;i;i--) ni[i-1]=ni[i]*(ll)i%ha;
} inline int C(int x,int y){ return x<y?0:jc[x]*(ll)ni[y]%ha*(ll)ni[x-y]%ha;} inline void init(){
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
} inline void solve(){
dp[0]=1;
for(int i=200,A=0,P=0,tot,lef;i;i--) if(num[i]){
lef=C(A+num[i]-1,num[i])*(ll)jc[num[i]]%ha,tot=add(C(A+num[i],num[i])*(ll)jc[num[i]]%ha,ha-lef); memset(f,0,sizeof(f));
for(int j=min(P,k);j>=0;j--){
f[j+1]=add(f[j+1],dp[j]*(ll)tot%ha);
f[j]=add(f[j],dp[j]*(ll)lef%ha);
}
memcpy(dp,f,sizeof(f)); P++,A+=num[i];
} int ans=0;
for(int i=0;i<=k;i++) ans=add(ans,dp[i]);
printf("%d\n",ans);
} int main(){
getC();
scanf("%d",&T);
while(T--){
init(),scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&N),num[N]++;
solve();
}
return 0;
}
CodeChef - LEMOVIE Little Elephant and Movies的更多相关文章
- CodeChef Little Elephant and Movies [DP 排列]
https://www.codechef.com/FEB14/problems/LEMOVIE 题意: 对于一个序列,定义其“激动值”为序列中严格大于前面所有数的元素的个数.给定n个数p1;,p2.. ...
- CodeChef LEMOVIE
题意:给你n个数字(下标不同数值相同的数字应当被认为是不同的数字),有n!种排列方式.每种排列方式的价值定义为:第一次出现时比前面的所有数字都大的数值个数. 比如1,2,2,3这个排列中,1,2,3这 ...
- scau 2015寒假训练
并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...
- codechef Little Elephant and Permutations题解
The Little Elephant likes permutations. This time he has a permutation A[1], A[2], ..., A[N] of numb ...
- CodeChef Little Elephant and Mouses [DP]
https://www.codechef.com/problems/LEMOUSE 题意: 有一个n *m的网格.有一头大象,初始时在(1,1),要移动到(n,m),每次只能向右或者向下走.有些格子中 ...
- codechef Little Elephant and Bombs题解
The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...
- CodeChef:Little Elephant and Colored Coins
类似墨墨的等式 设f[2][j][k]表示a[i].c是否和当前颜色相同,到当前枚举到的颜色为止,颜色数为j,对mnv取模为k的最小数 这是个无限循环背包,用spfa优化 #include<cs ...
- CodeChef Little Elephant and Balance
Given an array A1,A2...AN, you have to print the size of the largest contiguous subarray such that L ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
随机推荐
- java 操作mongodb查询条件的常用设置
java操作mongodb进行查询,常用筛选条件的设置如下: 条件列表:BasicDBList condList = new BasicDBList(); 临时条件对象:BasicDBObject c ...
- windows使用文件服务器搭建Git服务器
背景: 1.windows下搭建git服务器. 2.git服务器搭建在局域网文件共享区中. 3.没有复杂的权限控制,文件共享区都有访问权限. 步骤: 1.文件共享区中创建git远程仓库. 2.本地克隆 ...
- Python爬虫环境常用库安装
1:urllib urllib.request这两个库是python自带的库,不需要重新安装,在python中输入如下代码: import urllibimport urllib.requestres ...
- Ubuntu apt-get出现unable to locate package解决方案
前言 刚安装好的ubuntu 17发现apt-get安装指令异常. 故经网上搜索调查发现,发现这个问题基本是因为apt-get需要更新的缘故. 解决方案 只需使用命令升级更新即可. sudo apt- ...
- Python2.7 在使用BSTestRunner.py时报错TypeError: unicode argument expected, got 'str'
python3往这个库中加入了一些新的内容,使得该库在Python2.7中报错. 解决方法是将导入语句 from io import StringIO as StringIO 更换为: from io ...
- python datetime,time时间格式和用法
我是转载的这个大神的 他的网址:https://www.cnblogs.com/wanglinjie/p/9226926.html #以下是time的方法 >>> import ...
- 对linux中source,fork,exec的理解以及case的 使用
fork 使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child proc ...
- HAL——学习SysTick
开始: 1.嵌套向量中断寄存器 (NVIC): 嵌套向量中断控制器 (NVIC) 和处理器内核接口紧密配合,可以实现低延迟的中断处理和晚到中断的高效处理.包括内核异常在内的所有中断均通过 NVIC 进 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- 一个线程中lock用法的经典实例
/* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...