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 P1P2, ..., 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的更多相关文章

  1. CodeChef Little Elephant and Movies [DP 排列]

    https://www.codechef.com/FEB14/problems/LEMOVIE 题意: 对于一个序列,定义其“激动值”为序列中严格大于前面所有数的元素的个数.给定n个数p1;,p2.. ...

  2. CodeChef LEMOVIE

    题意:给你n个数字(下标不同数值相同的数字应当被认为是不同的数字),有n!种排列方式.每种排列方式的价值定义为:第一次出现时比前面的所有数字都大的数值个数. 比如1,2,2,3这个排列中,1,2,3这 ...

  3. scau 2015寒假训练

    并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...

  4. codechef Little Elephant and Permutations题解

    The Little Elephant likes permutations. This time he has a permutation A[1], A[2], ..., A[N] of numb ...

  5. CodeChef Little Elephant and Mouses [DP]

    https://www.codechef.com/problems/LEMOUSE 题意: 有一个n *m的网格.有一头大象,初始时在(1,1),要移动到(n,m),每次只能向右或者向下走.有些格子中 ...

  6. codechef Little Elephant and Bombs题解

    The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...

  7. CodeChef:Little Elephant and Colored Coins

    类似墨墨的等式 设f[2][j][k]表示a[i].c是否和当前颜色相同,到当前枚举到的颜色为止,颜色数为j,对mnv取模为k的最小数 这是个无限循环背包,用spfa优化 #include<cs ...

  8. 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 ...

  9. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

随机推荐

  1. Oracle 回顾

    Oracle 函数 日期函数: 1.sysdate--查询当前日期 select sysdate from dual;  --查询当前日期 2.months_between--返回两个日期之间的月份差 ...

  2. 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link

    Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...

  3. Pycharm快捷键及Python常用转义符

    不管是windows.xshell或者pycharm,学会使用快捷键都会使学习工作达到事半功倍的效果.这篇博客收集了部分常用的pycharm快捷键,分享给大家,希望对大家有用. 1. 常用快捷键 Py ...

  4. 【Python学习之二】装饰器

    装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...

  5. pandas.DataFrame——pd数据框的简单认识、存csv文件

    接着前天的豆瓣书单信息爬取,这一篇文章看一下利用pandas完成对数据的存储. 回想一下我们当时在最后得到了六个列表:img_urls, titles, ratings, authors, detai ...

  6. Python9- 生成器函数进阶-day14

    生成器进阶#send的获取下一个值的效果和next基本一致,#只不过在获取下一个值的时候,给上一个值的位置穿第一个数据 使用send的注册事项: #第一次使用生成器的时候,必须用next获取下一个值 ...

  7. 【转】Sqlserver通过链接服务器访问Oracle的解决办法

    一.创建sqlserver链接服务(sqlserver链接oracle)  首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1 ...

  8. 深入浅出Oracle:DBA入门、进阶与诊断案例(读书笔记2)

    第5章  Buffer Cache与Shared Pool原理 5.1 Buffer Cache原理 Buffer Cache是Oracle SGA中的一个重要部分,通常的数据访问和修改都需要通过Bu ...

  9. luogu3834 【模板】可持久化线段树 1(主席树)

    关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间. 关于借用节点: 图片来自这里 #include < ...

  10. android 之 View

    在进行游戏开发时,需要自定义各种控件和界面. 自定义View的使用: 绘制屏幕 刷新屏幕:后台数据发生了变化,需要开发人员自己刷新屏幕以显示最新数据 例子: MyView开发,绘制界面View内容: ...