题意:有一个$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. About configuration center of Apollo

    A comparison among different configuration management tools Use of Apollo configuration management p ...

  2. 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  3. BAT-快速切换JDK1.6/1.7

    Code: @echo OFF rem 修改背景/字体颜色为黑/绿 color 0A rem 自动设置JDK环境变量,本程序不会对 [系统环境变量] 造成破环!不需要重启!! rem 没有%%JAVA ...

  4. 78.PL和PS通过BRAM交互共享数据

    本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将结果 ...

  5. 76.ZYNQ-用PS控制DDR3内存读写

    本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧. 本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验 ...

  6. Linux-Load Average解析(转)

    load Average 1.1:什么是Load?什么是Load Average?   Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measur ...

  7. KM bfs写法

    KM bfs写法 2018astar资格赛的第三题整数规划. 把\(x, y\)看成二分图两边的顶标,\(a_{ij}\)就是二分图的边权,整道题其实就是求二分图的最大权匹配. 然后打了个\(dfs\ ...

  8. 全局应用程序类(Global.asax)

     注:该部分参考的园区的“积少成多”的 <ASP.NET MVC中的Global.asax文件> . 1.Global.asax文件介绍 global.asax这个文件包含全局应用程序事件 ...

  9. Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常

    Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...

  10. web2.0 HW3 相关阅读材料

    W3C官网的材料简直看花眼……除了挂出的文档,www-style@w3.org的一堆邮件也藏着很多宝,但是看下来又眼花了……(好在宝们基本都被W3C吸收了=.=) 主要来自W3C的官网w3.org的一 ...