神仙题

LOJ #6509


题意

给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1

求期望的移动距离使得所有点点权相同


题解

根本不会解方程

容易发现如果一个点不是最后一次被走到,就会随机下一个点并走过去

即如果我们能求出每个点非最后一次走到的期望次数,就可以算出答案

由于完全随机,初始相同颜色的点非最后一次走到的次数相同

设$ f_{i,0/1}$表示在有$ i$个1的时候,0/1非最后一次走到的期望次数

很艰难的列出方程如下

$$ f_{i,0} = \frac{i}{n} f_{i-1, 0} + \frac{n-i-1}{n} f_{i+1, 0} + \frac{1}{n} f_{i+1,1} + \frac{1}{n} $$
$$ f_{i,1} = \frac{n-i}{n} f_{i+1, 1} + \frac{i-1}{n} f_{i-1, 1} + \frac{1}{n} f_{i-1,0} + \frac{1}{n}$$

注意由于记录的是非最后一次走到,需要特判边界

即当前已经有$ n-1$个黑色时将最后一个白点翻成黑点不算入期望次数,黑点翻成白点同理

然后可以暴力高消了

但这个方程有很多优美的性质

不容易发现$ f_{i+1,1}$只和$ f_{i,1}$和$ f_{i-1,0/1}$有关

因此如果知道前面的信息就可以推出$ f_{i+1,1}$

同理再借助$ f_{i+1,1}$就能推出$ f_{i+1,0}$

因此我们设$ f_{1,0}=x,f_{1,1}=y$并把所有$ f_{x,0/1}$用$ Ax+By+c$表示

然后在最后联立两个方程解出$ x,y$就做完了

边界细节真**多


代码

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 1000000007
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt;
struct fc{
ll a,b,c;//ax+by+c
fc operator +(const fc s)const{return {a+s.a,b+s.b,c+s.c};}
fc operator -(const fc s)const{return {a-s.a,b-s.b,c-s.c};}
fc operator *(const int s)const{return {a*s%p,b*s%p,c*s%p};}
fc operator +(const int s)const{return {a,b,c+s};}
fc operator -(const int s)const{return {a,b,c-s};}
}f[][];
int inv[],fa[],size[];ll ans[];
char c[];
vector<int>E[];
int ksm(int x,int y=p-){
x%=p;
while(x<)x+=p;
int ans=;
for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
return ans;
}
void dfs(int x){
size[x]=;
for(auto i:E[x]){
dfs(i);
size[x]+=size[i];
ans[x]+=ans[i]+size[i];
}
}
void dfs2(int x){
if(x!=)ans[x]=ans[fa[x]]+n-size[x]*;
for(auto i:E[x])dfs2(i);
}
int main(){
n=read();scanf("%s",c+);int sum=;
for(rt i=;i<=n;i++)sum+=(c[i]=='');
inv[]=inv[]=;
for(rt i=;i<=n;i++)inv[i]=1ll*inv[p%i]*(p-p/i)%p;
f[][].a=;f[][].b=;
for(rt i=;i<=n-;i++){
if(i==)f[i+][]=(f[i][]*n-f[i-][]*(i-)-f[i-][])*inv[n-i];
else f[i+][]=(f[i][]*n-f[i-][]*(i-)-f[i-][]-)*inv[n-i];
f[i+][]=(f[i][]*n-f[i-][]*i-f[i+][]-)*inv[n-i-];
}
fc x=f[n][];
fc a0=f[n-][]*(n-)-f[n-][]*n,a1=f[n-][]*(n-)-f[n-][]*n+f[n-][]+;
ll a=a0.a,b=a0.b,C=a0.c,d=a1.a,e=a1.b,F=a1.c;
int invd=ksm(d);
int Y=(F%p*invd%p*a%p-C)%p*ksm(b%p-e%p*invd%p*a%p)%p;
int X=(b%p*Y%p+C%p)*ksm(a)%p;X=-X;
int B=(f[sum][].a*X+f[sum][].b*Y+f[sum][].c)%p+inv[n];
int W=(f[sum][].a*X+f[sum][].b*Y+f[sum][].c)%p+inv[n];
B%=p;W%=p;B=1ll*B*inv[n]%p,W=1ll*W*inv[n]%p;
for(rt i=;i<=n;i++){
fa[i]=read();
E[fa[i]].push_back(i);
}
dfs();dfs2();ll ret=;
for(rt i=;i<=n;i++)if(c[i]=='')(ret+=1ll*B*(ans[i]%p)%p)%=p;
else (ret+=1ll*W*(ans[i]%p)%p)%=p;
cout<<(ret+p)%p;
return ;
}

LOJ #6509. 「雅礼集训 2018 Day7」C的更多相关文章

  1. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  2. 【刷题】LOJ 6041 「雅礼集训 2017 Day7」事情的相似度

    题目描述 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的有相同的事情发 ...

  3. loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...

  4. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度

    我可以大喊一声这就是个套路题吗? 首先看到LCP问题,那么套路的想到SAM(SA的做法也有) LCP的长度是它们在parent树上的LCA(众所周知),所以我们考虑同时统计多个点之间的LCA对 树上问 ...

  5. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)

    题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...

  6. LOJ #6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相

    我可以大喊一声这就是个思博题吗? 首先如果你能快速把握题目的意思后,就会发现题目就是让你求出每个点要成为树的重心至少要嫁接多少边 先说一个显然的结论,重心的答案为\(0\)(废话) 然后我们考虑贪心处 ...

  7. LOJ #6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案

    我可以大喊一声这就是个SB题吗? 首先讲一句如果你像神仙CXR一样精通搜索你就可以得到\(80pts\)(无Subtask)的好成绩 我们考虑挖掘一下题目的性质,首先发现这是一个置换,那么我们发现这的 ...

  8. LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]

    题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...

  9. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

随机推荐

  1. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  2. centos下使用nginx 配置websocket,https升级wss协议

    服务端代码/***/ // 服务端代码 var express = require('express'); var app = express(); var path = require('path' ...

  3. springboot中访问jsp文件方式

    首先,添加加载jsp文件的依赖包: <!--jsp依赖 对应springboot版本为2.1.4--><dependency> <groupId>org.apach ...

  4. C#之Using(转)

    1.using指令. using 命名空间名字.例如: using System; 这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常 ...

  5. [转帖]Windows7/2008中批量删除隧道适配器的方法

    https://www.jb51.net/os/windows/479838.html 客户现场的硬件信息总是发生变化 这里查找一下资料 尝试一下. 1.在网卡属性的“网络”中,将“Internet协 ...

  6. vue 源代码创建tabs

    <ul class="tabs"> <li class="li-tab" v-for="(item,index) in tabsPa ...

  7. [LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法

    题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...

  8. 五一培训 清北学堂 DAY1

    今天是冯哲老师的讲授~ 1.枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些是有用的.能使命题成立的即为其解. 例一一棵苹果树上有n ...

  9. NOIP2018游记

    day1 不想吐槽题目了... 40min写完,然后对拍+玩小恐龙. 每个人都阿克了. 预计得分:100+100+100 day2 体验极差 t1本来想写 \(O(n)\) 做法,写到一半发现可以 \ ...

  10. 【转】C语言堆栈入门——堆和栈的区别

    @2019-04-25 [小记] C语言堆栈入门——堆和栈的区别