题意:有一个$k$面的骰子,上面的数字为$1\cdots k$,现在要丢$n$次骰子,设$n$次中有$a_i$次扔到数字$i$,给定$l,f$,求$\prod\limits_{i=1}^la_i^f$的期望,对$p=2003$取模

设$lf$个随机$0/1$变量$x_{i,j}$表示第$j$次的数字是否为$i$,那么每个变量都有$\frac1k$的概率为$1$,我们要求$\prod\limits_{i=1}^l\left(\sum\limits_{j=1}^nx_{i,j}\right)^f$的期望

如果把这个式子展开,最终的式子形如许多个$\prod x_{?,?}^?$之和,如果有一项同时含有$x_{a,j},x_{b,j}(a\neq b)$,那么它对答案的贡献为$0$,不妨对这些项按“含多少个不同的$x_{?,j}$”进行分类,最后再把每一类的结果加起来即可

设$f_{i,j}$表示在前$i$个$\left(\sum x_{?,?}\right)^f$中,选出$j$个不同的$x_{?,?}$的方案数(不考虑选的顺序),那么$f_{i,j}=\sum\limits_{k=1}^ff_{i-1,j-k}{f\brace k}$(在这$\left(\sum x_{?,?}\right)^f$中必须选$f$个$x_{?,?}$,去重后要得到$k$个不同的$x_{?,?}$,这样的方案与子集划分一一对应,考虑每个$x_{i,j}$第一次被选的位置和一个子集划分中每个子集的第一个元素即可得到它们是一一对应的)

设$g_i$表示最终选出来含$i$个不同的$x_{?,j}$的方案数,那么$g_i=[x^i]\left(\sum\limits_{i=1}^f{f\brace i}x^i\right)^l$,考虑顺序和概率后,答案就是$\sum\limits_{i=l}^{lf}n^\underline i\left(\frac1k\right)^ig_i$

因为答案中含下降幂,所以$i\geq p$的项都是$0$,于是算$g$只用暴力卷积到$p$位,总时间复杂度$O(p^2\log l)$

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int mod=2003;
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)(s*=a)%=mod;
		(a*=a)%=mod;
		b>>=1;
	}
	return s;
}
int S[1010][1010];
void pre(int n){
	int i,j;
	S[0][0]=1;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++)S[i][j]=(S[i-1][j-1]+S[i-1][j]*j)%mod;
	}
}
struct poly{
	int x[mod];
	poly(){memset(x,0,sizeof(x));}
	int&operator[](int k){return x[k];}
};
ll t[mod];
poly operator*(poly a,poly b){
	int i,j;
	poly c;
	memset(t,0,sizeof(t));
	for(i=0;i<mod;i++){
		for(j=0;j<mod;j++){
			if(i+j<mod)t[i+j]+=a[i]*b[j];
		}
	}
	for(i=0;i<mod;i++)c[i]=t[i]%mod;
	return c;
}
poly pow(poly a,int b){
	poly s;
	s[0]=1;
	while(b){
		if(b&1)s=s*a;
		a=a*a;
		b>>=1;
	}
	return s;
}
poly p;
void work(){
	int n,k,l,f,i,s,d,t;
	scanf("%d%d%d%d",&n,&k,&l,&f);
	memset(p.x,0,sizeof(p.x));
	for(i=1;i<=f;i++)p[i]=S[f][i];
	p=pow(p,l);
	k=pow(k%mod,mod-2);
	s=0;
	d=1;
	t=pow(k,l);
	for(i=0;i<l;i++)(d*=(n-i)%mod)%=mod;
	for(i=l;i<=l*f&&d;i++){
		(s+=(ll)d*t*p[i]%mod)%=mod;
		(d*=(n-i)%mod)%=mod;
		(t*=k)%=mod;
	}
	printf("%d\n",s);
}
int main(){
	int T;
	pre(1000);
	scanf("%d",&T);
	while(T--)work();
}

[CODECHEF]EASYEX的更多相关文章

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

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

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  6. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  7. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

  8. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

随机推荐

  1. C++面试中可能考察的基础知识(1)

    1 C++中允许函数的嵌套调用,但不允许函数的嵌套定义 2 构建派生类对象时,先调用基类的构造函数,在调用成员对象的构造函数,最后调用派生类构造函数. 3 volatile关键字 volatile提醒 ...

  2. 数组B - 我想我需要一艘船屋

    [题目大意]弗雷德先生正在考虑在路易斯安娜州买一块地造房子,在土地调查中,他了解到由于密西西比河的侵蚀,路易斯安那州正以每年50平方英里的速度变小.弗雷德先生想知道他买的那块地是否会被侵蚀掉,经过进一 ...

  3. 实现字符串检索strstr函数、字符串长度strlen函数、字符串拷贝strcpy函数

    #include <stdio.h> #include <stdlib.h> #include <string.h> /* _Check_return_ _Ret_ ...

  4. HDU 2191 珍惜现在,感恩生活 (dp)

    题目链接 Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都 ...

  5. MySQL源码分析(一)

    近段时间简单看了下Mysql源码相关内容,主要从一个select查询出发,查看了一下整个代码结构.分析总结如下: https://mubu.com/doc/explore/13965

  6. P3960 列队

    这是NOIP 2017最后一道题 不知道这道题有没有人代码写的和我一样麻烦. Solution 30分暴力 维护每行每列的元素. 每次删除一个元素的时候, 需要修改一行一列 因此复杂度上界\(O(nm ...

  7. DEDECMS如何让栏目外部链接在新窗口中打开

    dede的栏目打开方式默认的“当前窗口打开”,可以用下面两种方法让dede栏目在新窗口中打开. 方法1. 查找模板中的head.htm 将 <li><a href='[field:t ...

  8. FreeMarker使用之比较if

    1. =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. >或者gt:判断左边值是否大于右边值 4. >=或者gte:判断左边值是否大于等于右边值 5. <或者 ...

  9. 所有依赖的jar将提取到lib目录

    1.在pom.xml添加如下内容: <build> <plugins> <plugin> <artifactId>maven-dependency-pl ...

  10. IEEEXtreme 10.0 - Counting Molecules

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...