题意:有一个$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. java对象与json互转

    package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...

  2. Markdown tutorial [repost]

    1. italic We'll start by learning two basic elements in text formatting: italics and bold. In these ...

  3. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

  4. 初识smarty

    个人体会(不完全正确):就是smarty就是为了更好的使得php/html结合做出来的一个框架. ,

  5. vsftpd 安装配置详细教程

    linux下ftp软件不少,大致特点:<br /> wu-ftp:比较老牌,但针对它的攻击比较多,设置比较麻烦,但功能比较强大.<br /> vsftpd:功能强大,配置也比较 ...

  6. python基础===15条变量&方法命名的最佳实践

    不同的代码段采用不同的命名长度.通常来说,循环计数器(loop counters)采用1位的单字符来命名,循环判断变量(condition/loop variables)采用1个单词来命名,方法采用1 ...

  7. SSO单点登录的发展由来以及实现原理【转】

    单点登录以及权限,在很早之前都有写过,不过都比较简单,今天就具体说一下,以及下一步要做的 1.web单系统应用 早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的, ...

  8. sort排序命令常见用法

    sort -n 按数字排序 [root@test88 ~]# cat test.txt 19036 6111 24039 3660 20610 10937 32408 20744 8248 28255 ...

  9. Linux创建ftp并设置权限以及忘记ftp帐号(密码)修改

    忘记ftp密码修改方法: 1.登录服务器 cd  /etc/vsftpdcat ftpusers找到对应的ftp用户名 (如果用户名也忘记了 那么 cd /etc 然后cat passwd 查看用户和 ...

  10. storm的acker机制

    一.简介: storm中有一个很重要的特性: 保证发出的每个tuple都会被完整处理.一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所产生的所有的子tuple都被成功处理.如果 ...