题目大意

一开始有个人在 (x0,y0) (x_0,y_0),有 t t个时间点,每个时间点这个人会上下左右四个方向随机选一个方向走。给定n,mn,m,最后假如这个人停在了 (x,y) (x,y),他的权值 v=xnym v = x^ny^m。问 (E[v]×4t)mod109+7 (E[v]\times 4^t) \bmod{10^9+7}。

n,m≤100,t≤109 n,m \leq 100,t \leq 10^9

题解

将点的坐标变成 (a+b2,a−b2) (\frac{a+b}{2},\frac{a-b}{2})的形式,那么每一步,相当于变成 a a可以+1,−1+1,-1, b b可以+1,−1+1,-1并且两者独立了。那么我们相当于要求:

E[(a+b2)n×(a−b2)m]=∑i=0n∑j=0m(ni)(mj)E[(a2)i+j×(b2)n−i×(−b2)m−j]=∑i=0n∑j=0m(ni)(mj)E[(a2)i+j]×E[(b2)n−i]×E[(−b2)m−j]

\begin{aligned} &E\left[\left(\frac{a+b}{2}\right)^n \times \left(\frac{a-b}{2}\right)^m \right] \\ &=\sum_{i=0}^n \sum_{j=0}^m \binom{n}{i}\binom{m}{j}E\left[\left(\frac{a}{2}\right)^{i+j}\times \left(\frac{b}{2}\right)^{n-i} \times \left(-\frac{b}{2}\right)^{m-j}\right] \\ &= \sum_{i=0}^n \sum_{j=0}^m \binom{n}{i}\binom{m}{j}E\left[\left(\frac{a}{2}\right)^{i+j}\right] \times E\left[\left(\frac{b}{2}\right)^{n-i}\right] \times E\left[\left(-\frac{b}{2}\right)^{m-j}\right] \end{aligned}
剩下来的问题就是怎么求 E[ak] E\left[a^k\right],其中 a a表示最后的坐标对应的aa。
设 Tj,k T_{j,k}表示当前走了 j j步,aka^k的期望是多少。那么有

Tj,k=∑kp=0(kp)Tj−1,p+∑kp=0(kp)Tj−1,p(−1)k−p2

T_{j,k} = \frac{\sum_{p=0}^k \binom{k}{p}T_{j-1,p} + \sum_{p=0}^k \binom{k}{p} T_{j-1,p}(-1)^{k-p}}{2}

Tj,k=∑p=0,(k−p)mod2=0k(kp)Tj−1,p

T_{j,k} = \sum_{p=0,(k-p) \bmod{2} = 0}^k \binom{k}{p}T_{j-1,p}
这个由于 n+m≤200 n+m \leq 200,因此可以直接矩阵乘法搞。

那么整道题的复杂度就是 O((n+m)3logt) O((n+m)^3 \log t)。

#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int maxn = 205,mo = int(1e9) + 7;typedef int matrix[maxn][maxn];class RandomWalkOnGrid
{
public:matrix trans,mat_a,mat_b;int c[maxn][maxn],__n;int pow(int a,int b){int tmp = 1;for(;b;b >>= 1,a = a * 1ll * a % mo)if (b & 1) tmp = tmp * 1ll * a % mo;return tmp;}void mul(matrix &a,matrix &b,matrix &c){static matrix t;memset(t,0,sizeof t);for(int i = 0;i <= __n;i ++)for(int k = 0;k <= __n;k ++)if (a[i][k])for(int j = 0;j <= __n;j ++)if (b[k][j])t[i][j] = (t[i][j] + a[i][k] * 1ll * b[k][j]) % mo;memcpy(c,t,sizeof c);}void pow(matrix &a,int b){matrix tmp;memset(tmp,0,sizeof tmp);for(int i = 0;i <= __n;i ++) tmp[i][i] = 1;for(;b;b >>= 1,mul(a,a,a))if (b & 1) mul(tmp,a,tmp);memcpy(a,tmp,sizeof a);}int rev(int a){return pow(a,mo - 2);}int getExpectation(int x0,int y0,int t,int n,int m){__n = n + m;for(int i = 1;i <= __n;i ++) c[i][0] = c[0][i] = 1;for(int i = 1;i <= __n;i ++)for(int j = 1;j <= i;j ++)c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mo;c[0][0] = 1;for(int k = 0;k <= __n;k ++)for(int p = 0;p <= k;p ++)if ((k - p) % 2 == 0) trans[p][k] = 2ll * c[k][p] % mo;pow(trans,t);int ans = 0,a = ((x0 + y0) % mo + mo) % mo,b = ((x0 - y0) % mo + mo) % mo;for(int i = 0;i <= __n;i ++) mat_a[0][i] = pow(a,i),mat_b[0][i] = pow(b,i);mul(mat_a,trans,mat_a),mul(mat_b,trans,mat_b);for(int i = 0;i <= n;i ++)for(int j = 0;j <= m;j ++){int cur = mat_a[0][i + j] * 1ll * mat_b[0][n - i + m - j] % mo;if ((m - j) & 1) cur = (mo - cur) % mo;cur = cur * 1ll * rev(pow(2,n + m)) % mo;ans = (ans + cur * 1ll * c[n][i] % mo * c[m][j] % mo) % mo;}return ans;}
};

SRM 683 div1 hard相关推荐

  1. TC SRM 655 Div1 Level 3 题解

    TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...

  2. SRM 583 DIV1

    A 裸最短路. 1 class TravelOnMars { 2 public: 3 int minTimes(vector <int>, int, int); 4 }; 5 vector ...

  3. SRM 590 DIV1

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 水水更健康,终于回到1800+了... DIV2 ...

  4. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  5. SRM 563 Div1 500 SpellCards

    Description 有n张符卡排成一个队列,每张符卡有两个属性,等级lili和伤害didi. 你可以做任意次操作,每次操作为以下二者之一: 把队首的符卡移动到队尾. 使用队首的符卡,对敌人造成di ...

  6. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  7. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  8. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  9. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

最新文章

  1. SQL server根据值搜表名和字段
  2. ios 性能优化(一)
  3. (winform cookie)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证...
  4. Mybatis多参数封装到map中,多条件查询
  5. vscode浏览器扩展(图文教程) - 设置篇
  6. 关于captcha使用The _imagingft C module is not installed的错误处理
  7. python shell 继承 环境变量_Python subprocess shell 丢失环境变量 | 学步园
  8. IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
  9. 不得不爱开源 Wijmo jQuery 插件集(10)-【Expander】(附页面展示和源码)
  10. php 手机号 去掉86,手机号前面的+86是什么意思
  11. 毕业季音乐计算机简谱,毕业季简谱(歌词)-贺敬轩演唱-桃李醉春风记谱
  12. 安卓设备修改屏幕像素密度以及查看屏幕分辨率
  13. 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
  14. 【我的Android进阶之旅】解决Jenkins编译出现的Gradle错误:Gradle build daemon disappeared unexpectedly
  15. 阿里云智能技术战略架构师陈绪:透视2019云计算酣战
  16. 最近写收缩标题栏遇到的一个问题 requestLayout() improperly called by android.support.design.widget.CollapsingToolba
  17. 【夜读】2022年最后10天,致自己!
  18. python数据函数定义的规则是什么_Python自定义函数基础概念
  19. torch.cuda.is_available()返回false?
  20. 联想昭阳K4e电脑系统错误导致屏幕闪烁怎么重装系统?

热门文章

  1. LeetCode-1873. 计算特殊奖金
  2. 大陆人怎么去香港银行开户?
  3. MAC上测试常用工具整理
  4. 关于博客封面的提取与处理
  5. 【收集】个人认为比较实用的手机软件
  6. 深发银行为什么要更名为平安银行?
  7. 《痞子衡嵌入式半月刊》 第 21 期
  8. 2021年中国CRM市场规模及市场格局分析:市场规模达156亿元[图]
  9. 8K播放网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer和vlc播放RTSP流地址不兼容问题排查解决
  10. 罗技无线键盘linux,罗技发布旗下第一款无线机械游戏键盘 G613