0
点赞
收藏
分享

微信扫一扫

Codeforces Round #333 (Div. 2) E. Kleofáš and the n-thlon (概率dp)



E. Kleofáš and the n-thlon



time limit per test



memory limit per test



input



output


Kleofáš is participating in an n-thlon - a tournament consisting of n different competitions in n different disciplines (numbered 1 throughn). There are m participants in the n-thlon and each of them participates in all competitions.

In each of these n competitions, the participants are given ranks from 1 to m in such a way that no two participants are given the same rank - in other words, the ranks in each competition form a permutation of numbers from 1 to m. The score

The overall score

The overall rank of each participant is equal to 1 + k, where k is the number of participants with strictly smaller

The n-thlon is over now, but the results haven't been published yet. Kleofáš still remembers his ranks in each particular competition; however, he doesn't remember anything about how well the other participants did. Therefore, Kleofáš would like to know his expected overall rank.

All competitors are equally good at each discipline, so all rankings (permutations of ranks of everyone except Kleofáš) in each competition are equiprobable.


Input



The first line of the input contains two space-separated integers n (1 ≤ n ≤ 100) and m (1 ≤ m ≤ 1000) — the number of competitions and the number of participants respectively.

Then, n lines follow. The i-th of them contains one integer xi (1 ≤ xi ≤ m) — the rank of Kleofáš in the i-th competition.


Output



Output a single real number – the expected overall rank of Kleofáš. Your answer will be considered correct if

 its relative or absolute error doesn't exceed 10 - 9.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if 

Codeforces Round #333 (Div. 2) E. Kleofáš and the n-thlon (概率dp)_Div. 2

.

Examples


input


4 10
2
1
2
1


output


1.0000000000000000


input


5 5
1
2
3
4
5


output


2.7500000000000000


input


3 6
2
4
2


output


1.6799999999999999


Note


In the first sample, Kleofáš has overall score 6. Nobody else can have overall score less than 6 (but it's possible for one other person to have overall score 6 as well), so his overall rank must be 1.



题意:m个人参加n项比赛。每项比赛每个人都会有一个排名,排名也为该选手在该项比赛上的得分,一个人最后总得分为所有比赛得分之和。现在一个人,只记得他每场比赛的排名,也就是每场比赛的得分。假设所有人的实力一样,得分的概率也一样。求这个人最终排名的期望值。

题解:概率dp。

设dp[i][j]表示前 i 项比赛,得分为 j 的期望,那么转移方程就是:

dp[i][j]=s(dp[i-1][k])*1.0/(m-1)),其中0 <= j - m < = k < = j, k ! = j - a[ i ] (a[i]为第 i 场比赛该人的排名(得分))。

复杂度O(n*n*m)。

代码:


#pragma comment(linker, "/STACK:102400000,102400000")
//#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<queue>
#include<set>
#include<stack>
#include <utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define mst(a) memset(a, 0, sizeof(a))
#define M_P(x,y) make_pair(x,y)
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define per(i,j,k) for (int i = j; i >= k; i--)
#define lson x << 1, l, mid
#define rson x << 1 | 1, mid + 1, r
const int lowbit(int x) { return x&-x; }
const double eps = 1e-8;
const int INF = 1e9+7;
const ll inf =(1LL<<62) ;
const int MOD = 1e9 + 7;
const ll mod = (1LL<<32);
const int N = 110;
const int M=100010;
const int maxn=110000;
template <class T1, class T2>inline void getmax(T1 &a, T2 b) {if (b>a)a = b;}
template <class T1, class T2>inline void getmin(T1 &a, T2 b) {if (b<a)a = b;}
int read(){
int v = 0, f = 1;char c =getchar();
while( c < 48 || 57 < c ){if(c=='-') f = -1;c = getchar();}
while(48 <= c && c <= 57) v = v*10+c-48, c = getchar();
return v*f;}
int n,m;
int a[N];
double dp[N][maxn];
double s[N][maxn];
int main()
{
//freopen("in.txt","r",stdin);
n=read(),m=read();
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(m==1) //只有一个人
{
printf("%.9lf",1.0);
return 0;
}
memset(dp,0,sizeof(dp));
dp[0][0]=m-1;
s[0][0]=0;
for(int i=1;i<=n*m+1;i++) //比赛总数
{
s[0][i]=m-1;
}
for(int i=1;i<=n;i++) //前 n项比赛
{
s[i][0]=0;
s[i][1]=0;
for(int j=1;j<=n*m;j++) //全部比赛
{
int r=j;
int l=max(0,j-m);
dp[i][j]=dp[i][j] + (s[i-1][r]-s[i-1][l])*1.0/(m-1);

if(j-a[i]>=0)
{
dp[i][j]=dp[i][j] - dp[i-1][j-a[i]]*1.0/(m-1);
}
s[i][j+1] = s[i][j]+dp[i][j];
}
}
printf("%.9lf",s[n][sum]+1);
return 0;
}



举报

相关推荐

0 条评论