Luogu T7468 I liked Matrix!
Posted 青石巷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu T7468 I liked Matrix!相关的知识,希望对你有一定的参考价值。
题目背景
无
题目描述
在一个n*m 的矩阵A 的所有位置中随机填入0 或1,概率比为x : y。令B[i]=a[i][1]+a[i][2]+......+a[i][m],求min{B[i]}的期望,并将期望乘以(x + y)^nm 后对1e9+7取模。
输入输出格式
输入格式:
共一行包含四个整数n,m,x ,y。
输出格式:
共一行包含一个整数ans,表示期望乘以(x + y)^nm 后模1e9+7的值。
输入输出样例
2 2 1 1
10
说明
对于20% 的数据:n,m,x,y<=3
对于40% 的数据:n,m,x,y<= 70
对于70% 的数据:n,m,x,y<=5000
对于100% 的数据:n,m,x,y<=200000
数学知识:
数学期望是试验中所有可能结果的概率乘以其结果的总和,它反映随机变量平均取值的大小。需要注意的是,期望值并不一定等同于常识中的期望——期望值也许与每一个结果都不相等。换句话说,期望值是该变量取值的平均数,但并不一定包含在变量的输出值集合里。
在本题中,期望E =0*P(min{B[i]}=0)+1*P(min{B[i]}=1)+2*P(min{B[i]}=2)+......+m*P(min{B[i]}=m)。
题目要求将期望乘以(x + y)^nm,可以等价于:
对于矩阵中的每一个元素暴力枚举x+y 次取值,其中x 次为0,y 次为1,一共得到(x+y)^nm 个矩阵,分别计算其min{B[i]}的值并求和。
题目来源:江苏省常州高级中学 在此鸣谢
题解:
20分做法:见上文数学知识中的“等价于”部分。
30,70分做法:不同的DP。(DP蒟蒻表示并不会写这个部分分QAQ)
100分做法:
预备知识:
二项分布(苏教版数学选修2-3内容)。
$\\because$对于矩阵中任意一行,情况均相同,记矩阵中某行元素之和为$B$。
由二项分布知,每一个元素为0的概率为$\\frac{x}{x+y}$,为1的概率为$\\frac{y}{x+y}$。
$\\therefore P_{B=i}=C^{m}_{i}(\\frac{x}{x+y})^{m-i}\\cdot(\\frac{y}{x+y})^{i}$
=$\\frac{C^m_i \\cdot x^{m-i} \\cdot y^i}{(x+y)^m}$
在$min_B=i$的情况下,对于每一行的$B$,均有$B \\geq i$,$\\because \\exists B=i$,也就是要除去每一行的$B$都大于$i$的情况。
$\\therefore P_{(min_{B}=i)}=P^n_{B \\geq i}-P^n_{B>i}$
$=P^n_{B \\geq i}-P^n_{b \\geq i+1}$。
$\\therefore E=\\sum_{i=0}^{m}i \\cdot P_{min_{B}=i}$
$=\\sum_{i=1}^{m}i \\cdot P^n_{B \\geq i}-i \\cdot P^n_{b \\geq i+1}$
$=P^n_{B \\geq 1}-P^n_{B \\geq 2}+2P^n_{B \\geq 2}-2P^n_{B \\geq 3}+ \\cdots -m \\cdot P^n_{B \\geq m+1}$
$\\because P_{B \\geq m+1}=0$
$\\exists E=\\sum_{i=1}^{m}P^{n}_{B \\geq i}$.
又$\\because P_{B \\geq i}=P_{B=i}+P_{B=i+1}+ \\cdots +P_{B=m}$
$\\therefore E=\\sum_{i=1}^{m}(\\sum_{j=i}^{m}P_{B=j})^{n}$
$=\\sum_{i=1}^{m}(\\sum_{j=i}^{m}\\frac{C_{m}^{j} \\cdot x^{m-j} \\cdot y^j}{(x+y)^m})^n$
$\\therefore ans=(x+y)^{m \\cdot n}\\cdot E=\\sum_{i=i}^{m}(\\sum_{j=i}^{m}C_{m}^j \\cdot x^{m-j} \\cdot y^j)^n$
$\\because m,x,y$给定
$\\therefore $记$C_{m}^{j}x^{m-j} \\cdot y^{j}=A_{j},S_{j}=\\sum_{i=1}^{j}A_i$
$\\therefore ans=\\sum_{i=1}^{m}(\\sum_{j=i}^{m}C_{m}^j \\cdot x^{m-j} \\cdot y^j)^n$
$=\\sum_{i=1}^{m}(S_{m}-S_{i-1})^n$
$O_{(n)}$预处理出$C_{m}^{i}$,随后计算$A_{i},S_{i}$,求和即可。
一道裸的数学题……
代码:
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define f(m,j) c[j]*pow_mod(y,j)%MOD*pow_mod(x,m-j)%MOD 4 using namespace std; 5 const int maxn=2e5+10,MOD=1e9+7; 6 LL fac[maxn],infac[maxn],c[maxn]; 7 LL a[maxn],s[maxn]; 8 int n,m,x,y;LL ans=0; 9 LL pow_mod(LL a,int k) 10 { 11 LL ans=1; 12 for(;k;a=a*a%MOD,k>>=1){if(k&1){ans=ans*a%MOD;}} 13 return ans; 14 } 15 void init() 16 { 17 int i,j; 18 fac[0]=1; 19 for(i=1;i<=m;i++){fac[i]=fac[i-1]*i%MOD;} 20 for(i=0;i<=m;i++){infac[i]=pow_mod(fac[i],MOD-2);} 21 for(i=0;i<=m;i++){c[i]=fac[m]*infac[i]%MOD*infac[m-i]%MOD;} 22 } 23 int main() 24 { 25 int i,j;LL tmp; 26 cin>>n>>m>>x>>y; 27 init(); 28 for(i=1;i<=m;i++){a[i]=f(m,i);s[i]=(s[i-1]+a[i])%MOD;} 29 for(i=1;i<=m;i++) 30 { 31 tmp=(s[m]-s[i-1]+MOD)%MOD; 32 ans=(ans+pow_mod(tmp,n))%MOD; 33 } 34 cout<<ans; 35 return 0; 36 }
以上是关于Luogu T7468 I liked Matrix!的主要内容,如果未能解决你的问题,请参考以下文章