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 ...
随机推荐
- MySQL数据库安全配置
文章来源:http://www.xfocus.net MySQL数据库安全配置 1.前言 MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具 ...
- java第九次作业:第九章例题3个
作业1: 例题9.1 制作圆类,根据圆的半径求出周长及面积 package com.swift; //抽象的方法构成类,把属性和方法进行封装 public class Circle { // 两个方面 ...
- C# IsNullOrEmpty与IsNullOrWhiteSpace
IsNullOrEmpty:非空非NULL判断 IsNullOrWhiteSpace:非空非NULL非空格判断 后者优于前者 if (!string.IsNullOrWhiteSpace(valueE ...
- Cocos2d-X研究之3.0 场景切换特效汇总
Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05 0个评论 来源:游戏编程 收藏 我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...
- c++ 结构体,设置物品体积并输出物品属性
#include <iostream> using namespace std; struct box { char maker[40]; float height; float widt ...
- PAT 乙级 1011
题目 题目地址:PAT 乙级 1011 思路 这道题的比较坑的地方在于给定数据的范围 int 类型的数据大小是[-2^31 , 2^31 -1] 即 [-2147483648,2147483647] ...
- perl学习 之:my local our
范围声明 和全局声明类似,词法范围声明也是在编译时起作用的.和全局声明不同的是,词法范围声明的作用范围是从声明开始到闭合范围的最里层(块,文件,或者 eval--以先到者为准).这也是为什么我们称它为 ...
- laravel中文字模型的增删改查
模型是用ORM 来做, 使用类来表示一个表,每个表都对应一个模型,以供上层使用 创建模型在项目中的位置定位: /app/下面 好了,我们来创建一个模型: php artisan make:model ...
- 封装微信分享到朋友/朋友圈js
在页面引入: <script src="/static/lib/jquery-2.2.2.min.js"></script><script src=& ...
- 1. Go的安装和第一行代码
Go 语言环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Windows 安装包下载地址为:https://golang.org/dl/. 如 ...