LOJ #6509. 「雅礼集训 2018 Day7」C
神仙题
题意
给定一棵树,点权为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的更多相关文章
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- 【刷题】LOJ 6041 「雅礼集训 2017 Day7」事情的相似度
题目描述 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的有相同的事情发 ...
- loj 6043「雅礼集训 2017 Day7」蛐蛐国的修墙方案
loj 爆搜? 爆搜! 先分析一下,因为我们给出的是一个排列,然后让\(i\)给\(p_i\)连边,那么我们一定会得到若干个环,最后要使得所有点度数为1,也就是这些环有完备匹配,那么最后一定全是偶环. ...
- LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度
我可以大喊一声这就是个套路题吗? 首先看到LCP问题,那么套路的想到SAM(SA的做法也有) LCP的长度是它们在parent树上的LCA(众所周知),所以我们考虑同时统计多个点之间的LCA对 树上问 ...
- loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)
题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...
- LOJ #6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相
我可以大喊一声这就是个思博题吗? 首先如果你能快速把握题目的意思后,就会发现题目就是让你求出每个点要成为树的重心至少要嫁接多少边 先说一个显然的结论,重心的答案为\(0\)(废话) 然后我们考虑贪心处 ...
- LOJ #6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
我可以大喊一声这就是个SB题吗? 首先讲一句如果你像神仙CXR一样精通搜索你就可以得到\(80pts\)(无Subtask)的好成绩 我们考虑挖掘一下题目的性质,首先发现这是一个置换,那么我们发现这的 ...
- LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
- LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)
题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...
随机推荐
- nginx 常见正则匹配符号表示
1.^: 匹配字符串的开始位置: 2. $:匹配字符串的结束位置: 3..*: .匹配任意字符,*匹配数量0到正无穷: 4.\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了: 5.(值1|值 ...
- Flutter之内置动画(转)
AnimatedContainerAnimatedCrossFadeHeroAnimatedBuilderDecoratedBoxTransitionFadeTransitionPositionedT ...
- MyBatis 3
MyBatis 3 学习笔记 一.Mybatis 基础知识 1.MyBatis 3编写步骤: 根据mybatis-config.xml配置文件创建一个SqlSessionFactory对象. sql映 ...
- Zookeeper+Kafka集群部署(转)
Zookeeper+Kafka集群部署 主机规划: 10.200.3.85 Kafka+ZooKeeper 10.200.3.86 Kafka+ZooKeeper 10.200.3.87 Kaf ...
- 利用layui前端框架实现对不同文件夹的多文件上传
利用layui前端框架实现对不同文件夹的多文件上传 问题场景: 普通的input标签实现多文件上传时,只能对同一个文件夹下的多个文件进行上传,如果要同时上传两个或多个文件夹下的文件,是无法实现的.这篇 ...
- Spring中@Transactional用法
作者:bladestone 来源:CSDN 原文:https://blog.csdn.net/blueheart20/article/details/44654007 版权声明:本文为博主原创文章,转 ...
- LODOP打印用JS获取的当前日期
该文详细一步步解释JS获取当前时间的方法,新手小白也看到懂,最后是实际的获取当前年月份的方法.JS中的Date()对象,包含很多当前系统时间的方法,首先建立一个Date()对象,这里取名为date,然 ...
- [LOJ3088][GXOI/GZOI2019]旧词——树链剖分+线段树
题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...
- Day 1 下午
POINT 1 贪心 每一步都取当前的最优解的思想:一般来说符合直观思路,需要严格的证明:OI中使用多个错误的贪心策略进行加成有时会有良好的效果 例一给定N个农民,第i个农民有Ai单位的牛奶,单价Pi ...
- 硬盘安装Kali
网上找到一些用EasyBCD硬盘安装的方式,可能对Kali Linux 1.0 .2.0等较老版本有用.目前的最新的Kali Linux 2016.2 用EasyBCD可以进入 Live,但是进入li ...