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(回滚莫队)
题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...
随机推荐
- HTML基础-------HTML标签(2)
HTML标签(2) a标签(容器级单标签) 语义:跳转到指定的连接 属性 列表系列 1.无序列表 该列表由两部分组成:ul标签嵌套li标签(ul标签是典型的容器级标签) 图示: 2.有序列表 该列表由 ...
- 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
最近开始尝试用go写点东西,正好在看LLVM的资料,就写了点相关的内容 - 前端解析器+中间代码生成(本地代码的汇编.执行则靠LLVM工具链完成) https://github.com/daibinh ...
- JS 设计模式九 -- 装饰器模式
概念 装饰者(decorator)模式能够在不改变对象自身的基础上,动态的给某个对象添加额外的职责,不会影响原有接口的功能. 模拟传统面向对象语言的装饰者模式 //原始的飞机类 var Plane = ...
- java gusnum
package guss; import java.util.Scanner; public class gussnum { String myin; int y; public int gussnu ...
- Linux下find命令用法详解
Linux下find命令用法详解 学神VIP烟火 学神IT教育:XueGod-IT 最负责任的线上直播教育平台 本文作者为VIP学员 烟火 第一部分:根据文件名查找 1.在当前目录 ...
- (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
就在我们使用Pc接通安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较强的app好比之前我们使用的一个app引号精灵,老版本就需 ...
- 【Linux】CentOS7下安装JDK详细过程
https://www.cnblogs.com/sxdcgaq8080/p/7492426.html
- nginx 项目部署
一.nginx 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web 网络服务是一种被 ...
- Nginx从入门到实践(四)
Nginx常见问题和排错经验,实践应用场景中的方法处理Nginx安全,常见的应用层安全隐患,复杂访问控制,Nignx的sql防注入安全策略,Nginx的整体配置,搭建合理Nginx中间件架构配置步骤. ...
- CF1153 F. Serval and Bonus Problem(dp)
题意 一个长为 \(l\) 的线段,每次等概率选择线段上两个点,共选出 \(n\) 条线段,求至少被 \(k\) 条线段覆盖的长度期望. 数据范围 \(1 \le k \le n \le 2000, ...