神仙题

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. iis问题

    1.8.5版本的iis配置完成,不能打开网页显示503.原因是应用程序池,加载用户配置文件失败,然后应用程序池关闭了.关闭它就可以正常打开了. server2008,打不开网页,打开url显示目录的原 ...

  2. node的第一步,hello,以及小技巧和CPU使用情况。到底能用几个核心?

    安装了啥的就不说了,百度一下有很多. Windows环境.Linux不会,所有就不说了. 1.  hello Word node的hello Word很简单,就一行. console.log(&quo ...

  3. myeclipse新建javaweb项目,并部署到tomcat

    myeclipse使用的版本: 新建web项目: File-->New-->Web Project,输入项目名称,选择J2EE规范. 完成后: JRE System Library是只要做 ...

  4. 菜鸟学IT之python网页爬取初体验

    作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2881 1. 简单说明爬虫原理 爬虫简单来说就是通过程序模拟浏览器放松请求站 ...

  5. vue填坑指南之模板的使用

    坑提示:"The template root requires exactly one element" Src下面有个App.vue文件,在index里引用了这个文件以后,我在. ...

  6. Linux centos yum仓库 自制

    内网下Yum仓库搭建配置 1.实验环境 虚拟机环境: VMware 12 版本虚拟机 网络环境: 内网 IP 段:172.16.1.0 外网 iP 段(模拟):10.0.0.0 实验基础:(能够上网, ...

  7. js 实现数据结构 -- 链表

    原文: 在 Javascript 中学习数据结构与算法. 概念: 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个 元素由一个存储元素本身的节点和一个指向下一个元素的引 ...

  8. MySQLorder by用法

    首先,order by是用来写在where之后,给多个字段来排序的一个DQL查询语句. 其次,order by写法: 1.  select 字段列表/* from 表名 where 条件 order ...

  9. 【linux】Python3.6安装报错 configure: error: no acceptable C compiler found in $PATH

    安装python的时候出现如下的错误: [root@master ~]#./configure --prefix=/usr/local/python3.6 checking build system ...

  10. Leetcode 4.28 Tree Easy

    1. 101. Symmetric Tree 用递归. class Solution { public boolean isSymmetric(TreeNode root) { if( root == ...