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的值。

输入输出样例

输入样例#1:

2 2 1 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内容)。

蒟蒻不会用LaTex,暂且用这个替代一下吧......

代码:

 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 }

时间: 2024-10-14 14:49:17

Luogu T7468 I liked Matrix!的相关文章

luogu题解 UVA11992 【Fast Matrix Operations】

题目链接: https://www.luogu.org/problemnew/show/UVA11992 题目大意: 一个r*c的矩阵,一开始元素都是0,然后给你m次三种操作,分别是将一个子矩阵中所有元素加上v,将一个子矩阵元素全部修改成v,询问一个子矩阵中所有元素和,最大值和最小值. 思路: 应该说是一道有点毒瘤的数据结构题(然而时限居然给了5s)了,虽然它的主体只是线段树.我们可以把每一行都看作一棵线段树,这样操作就十分方便了. 然后就是修改值的操作,对于初学者可能有点棘手,但实际上并不难,

luogu 3790 文艺数学题 - 矩阵树定理 - 容斥原理

题目传送门 戳我来传送 题目大意 给定一个图,问它的所有生成树的边权的最大公约数之和. 可以考虑计算边权的最大公约数为$i$的生成树的个数$f(i)$,最后累加答案. 然后考虑这样的生成树的个数怎么求,根据某个经典套路,我们可以容斥. 因为可以求出边权的最大公约数为$i$的倍数的生成树的个数$F(i)$,所以减去它的倍数的$f$就是$f(i)$了. 但是这么做会T掉. 可以用$O(W\log W)$的时间内预处理出为边权$i$的倍数的边数有多少条.然后高消前判断一下边数是否大于等于$n - 1$

luogu P1357 花园

题目链接 luogu P1357 花园 题解 开始读错题了,QAq,只看了m<=n,然后这怎je做啊QAq 用一种可行状态做环的起始部分,维护后m个的状态,进行装压dp,在后边插可行状态,那么如何保证环呢 , 由于是环,所以转移n次后,贡献有用的方案是,末装态与原来相同的方案 ,(也就是末状态转移为初状态的方案) 当然,状态必须在满足条件的状态中转移 ->80pts 对于转移矩阵,矩阵快速幂优化装态转移的递推 ->100pts 那么状态S答案为矩阵[S][S]的值 代码 #include

【luogu P1939 【模板】矩阵加速(数列)】 题解

题目链接:https://www.luogu.org/problemnew/show/P1939 对于矩阵推序列的式子: 由题意知: f[x+1] =1f[x] + 0f[x-1] + 1f[x-2] f[x] = 1f[x] + 0f[x-1] + 0f[x-2] f[x-1] = 0f[x] + 1f[x-1] + 0*f[x-2] 所以矩阵初项的系数: 1 1 0 0 0 1 1 0 0 #include <cstdio> #include <cstring> #includ

[luogu 5024] 保卫王国

luogu 5024(保卫王国) Problem Here Solution 这大概是一篇重复累赘的blog吧. 最小覆盖集=全集-最大独立集 强制取或不取,可以通过将权值修改成inf或者-inf 然后就用动态dp的套路就行了 #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline ll read

Luogu P4122 [USACO17DEC]Blocked Billboard

Luogu P4122 [USACO17DEC]Blocked Billboard 解析 画图想一想,莫得想复杂咯! Code #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long using namespace std; struct matrix { int ax,ay,bx,

luogu P3263 [JLOI2015]有意义的字符串

luogu 兄弟会背叛你,女人会离开你,金钱会诱惑你,生活会刁难你,只有数学不会,不会就是不会,怎么学都不会. 先记\(A=\frac{b+\sqrt{d}}{2}\),出现这种东西不妨考虑他的"共轭项"",记\(B=\frac{b-\sqrt{d}}{2}\).可以发现\(A+B=b,AB=\frac{b^2-d}{4}\),并且由于\(b\bmod 2=1,d\bmod 4=1\),所以\(AB\)的值一定是个整数 现在要求\(\lfloor A^n\rfloor\),由

hdu 5015 233 Matrix (矩阵快速幂)

题意: 有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333... 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗? n,m(n ≤ 10,m ≤ 10 9)输出 a n,m mod 10000007. 思路:首先我们观察n和m的取值范围,会发现n非常小而m却非常大,如果

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo