2021牛客暑期多校训练营6 :D Gambling Monster 期望dp + fwt + cdq分治

传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个大轮盘,被分成了nnn个区域0,1,2,..,n−10,1,2,..,n-10,1,2,..,n1,每个区域被转到的概率是ai∑j=0n−1aj\frac{a_i}{\sum_{j=0}^{n-1}a_j}j=0n1ajai,转到第iii个区域的时候得分是iii。现在你初始有x=0x=0x=0分,每次转动轮盘假设得到了yyy分,那么如果x⊕y≤xx\oplus y\le xxyx的话,当前得分不会变化,否则将x=x⊕yx=x\oplus yx=xy,当得分达到n−1n-1n1的时候立即停止,问你转转盘轮数的期望。
2≤n≤2162\le n\le2^{16}2n216,且nnn222的幂次。

思路:

以下我们约定:aia_iai代表得分为iii的概率。
考虑期望dpdpdp,我们这里倒着来推,所以设f[i]f[i]f[i]表示当得分为iii的时候还需要进行的轮数期望是多少,很容易就可以得到n2n^2n2的一个转移方程:fi=∑j=0n−1[(i⊕j)>i](fi⊕j+1)∗aj+∑j=0n−1[(i⊕j≤i)](fi+1)∗ajf_i=\sum_{j=0}^{n-1}[(i\oplus j)>i](f_{i\oplus j}+1)*a_j+\sum_{j=0}^{n-1}[(i\oplus j\le i)](f_i+1)*a_jfi=j=0n1[(ij)>i](fij+1)aj+j=0n1[(iji)](fi+1)aj
考虑到方程两边都有f[i]f[i]f[i],我们进行移项:
fi=∑j=0n−1aj+∑j=0n−1[(i⊕j)>i]fi⊕j∗aj1−∑j=0n−1[(i⊕j≤i)]ajf_i=\frac{\sum_{j=0}^{n-1}a_j+\sum_{j=0}^{n-1}[(i\oplus j)>i]f_{i\oplus j}*a_j}{1-\sum_{j=0}^{n-1}[(i\oplus j\le i)]a_j}fi=1j=0n1[(iji)]ajj=0n1aj+j=0n1[(ij)>i]fijaj
这个式子一眼看去只能n2n^2n2求,可以发现瓶颈就在∑j=0n−1[(i⊕j)>i]fi⊕j∗aj\sum_{j=0}^{n-1}[(i\oplus j)>i]f_{i\oplus j}*a_jj=0n1[(ij)>i]fijaj这个式子上,我们将其化简一下,设x=i,y=j,z=x⊕yx=i,y=j,z=x\oplus yx=i,y=j,z=xyf(x)=∑x⊕y=z,z>xf(z)a(y)f(x)=\sum_{x\oplus y=z,z>x}f(z)a(y)f(x)=xy=z,z>xf(z)a(y),看到f(x)f(x)f(x)的式子很像异或卷积,所以为了更直观,继续化简f(x)=∑z⊕y=x,z>xf(z)a(y)f(x)=\sum_{z\oplus y=x,z>x}f(z)a(y)f(x)=zy=x,z>xf(z)a(y)
观察可知,那么去掉z>xz>xz>x的条件的话,这个就是一个异或卷积的裸式子了,考虑到对于iii只有>i>i>ifff能对其有贡献,所以考虑cdqcdqcdq分治来计算这个式子,就可以去掉z>xz>xz>x这个条件了。在分治的过程中,只需要先递归计算右边的值,让后计算当前左区间的值,再递归左区间处理子问题即可。
但是问题还没有解决,a(y)a(y)a(y)怎么确定呢?在卷的过程中我们需要保证所有aaa都需要符合条件才可,不然会卷出来其他不合法的答案。考虑当前区间分成的两部分[l,mid],[mid+1,r][l,mid],[mid+1,r][l,mid],[mid+1,r]对应的二进制分别是[xxx000,xxx011],[xxx100,xxx111][xxx000,xxx011],[xxx100,xxx111][xxx000,xxx011],[xxx100,xxx111],发现了什么?我们计算左区间的时候,他们的aaa是那些部分呢?显然答案应该是aaa中下标在[100,111][100,111][100,111]的范围内的数,可以发现左区间[xxx000,xxx011][xxx000,xxx011][xxx000,xxx011]异或上区间内任何一个数都会准确的落在右区间的某个位置,且只有这些数能落在右区间。所以卷的时候让右区间的fff和上面的aaa对应区间卷起来即可。
递归到l=rl=rl=r的时候直接计算答案即可。

// Problem: Gambling Monster
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11257/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=100010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N],b[N],c;
LL f[N],iv2,u[N],all;LL qmi(LL a,LL b) {LL ans=1;  a%=mod; a+=mod; a%=mod;while(b) {if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans%mod;
}int x[N], y[N];
void FWT_xor(int *a,int opt,int N)
{for(int i=1;i<N;i<<=1)for(int p=i<<1,j=0;j<N;j+=p)for(int k=0;k<i;++k){int X=a[j+k],Y=a[i+j+k];a[j+k]=(X+Y)%mod;a[i+j+k]=(X+mod-Y)%mod;if(opt==-1)a[j+k]=1ll*a[j+k]*iv2%mod,a[i+j+k]=1ll*a[i+j+k]*iv2%mod;}
}void cdq(int d,int l,int r,LL sa) {if(l==r) {f[l]+=all%mod; f[l]%=mod;(f[l]*=qmi(1-(all-sa)%mod,mod-2))%=mod;return;} int len=1<<d; LL sum=0;cdq(d-1,l+len,r,sa);for(int i=0;i<len;i++) {x[i]=a[i+len]; sum+=x[i]; sum%=mod;y[i]=f[i+l+len];}FWT_xor(x,1,len); FWT_xor(y,1,len);for(int i=0;i<len;i++) {x[i]=1ll*x[i]*y[i]%mod;}FWT_xor(x,-1,len);for(int i=0;i<len;i++) {(f[i+l]+=x[i])%=mod;	}cdq(d-1,l,l+len-1,(sa+sum)%mod);
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);iv2=qmi(2,mod-2);int _; scanf("%d",&_);while(_--) {scanf("%d",&n); LL sum=0;memset(f,0,sizeof(f));for(int i=0;i<n;i++) scanf("%d",&a[i]),sum+=a[i];sum=qmi(sum,mod-2);  all=0;for(int i=0;i<n;i++) a[i]=a[i]*sum%mod,all+=a[i],all%=mod;for(int i=16;i>=0;i--) {if((1<<i)==n) {cdq(i-1,0,n-1,0);break;}}printf("%lld\n",f[0]%mod);}return 0;
}
/*
200000005
3
3
0*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软宣布SQL Server 2019免费支持Java

在 2018 年 9 月的时候&#xff0c;微软就宣布与领先的 Java 开源贡献者和发行商 Azul Systems 建立新的合作伙伴关系。这一关系允许所有 Azure 客户在微软和 Azul 联合提供的支持下&#xff0c;免费使用 Azul 的 Zulu for Azure-Enterprise Java 发行版 。最近&#xff0c;微软…

P4231 三步必杀 二次差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 考虑给[2,6][2,6][2,6]加上s2,e10s2,e10s2,e10的等差数列&#xff0c;变成2,4,6,8,102,4,6,8,102,4,6,8,10&#xff0c;考虑差分数组2,2,2,2,2,−102,2,2,2,2,-102,2,2,2,2,−10&#xff0…

创新的迷思——2019 Microsoft Hackathon 苏州站回顾

每年&#xff0c;微软在7月份都会在内部举办一次黑客松&#xff08;Hachathon&#xff09;活动&#xff0c;所有的员工&#xff0c;包括实习生都可以自由组队参赛&#xff0c;在为期一周的时间内完成构想、设计和开发的一系列过程&#xff0c;并且在最后一天进行项目路演和评选…

P4062 [Code+#1]Yazid 的新生舞会 树状数组维护三阶差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个序列aaa&#xff0c;让你求有多少个子区间满足存在一个数是这个区间的绝对众数&#xff0c;绝对众数指该数在区间内出现的次数严格大于r−l12\frac{r-l1}{2}2r−l1​。 n≤5e5,0≤ai≤n−1n\le5e5,0…

一句话概括4本管理著作

之前618活动的时候买了不少书&#xff0c;最近一段时间集中看了四本管理相关的书籍&#xff0c;收获颇丰。在这里分享给大家。如果你不是管理者也没关系&#xff0c;可以换个视角来看看管理者眼中的世界&#xff0c;毕竟&#xff0c;“赤兔马”也需要让“伯乐”看到才行嘛。虽然…

[译].Net中的内存-什么分配在了哪里

原文链接&#xff1a;https://jonskeet.uk/csharp/memory.html人们在理解值类型和引用类型之间的差异时因为“值类型在栈上分配&#xff0c;引用类型在堆上分配”这句话造成了很多混乱。这完全是不对的&#xff0c;本文试图澄清这个问题。变量中有什么&#xff1f;理解.NET中内…

HDU - 7029 Median 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你1,2,...,n1,2,...,n1,2,...,n一共nnn个数&#xff0c;你需要将其分成mmm组&#xff0c;使得每组的中位数为bib_ibi​&#xff0c;保证bib_ibi​互不相同。 中位数取ck12c_{\frac{k1}{2}}c2k1​​ n,m≤1…

加密的病历单

加密的病历单 加密的病历单 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 小英是药学专业大三的学生&#xff0c;暑假期间获得了去医院药房实习的机会。 在药房实习期间&#xff0c;小英扎实的专业基础获得了医生的一致好评&#xff0c;得知小英在计算概论中取…

上车时机已到--.NETCore是适应时代发展的雄鹰利剑

要起飞了.NET Core 3.0-prevew7&#xff1a;https://dotnet.microsoft.com/download/dotnet-core/3.0随着 .NET Core 3.0-prevew7 的发布&#xff0c;开源社区的一支重要力量重要即将起飞&#xff1b;官方指出&#xff0c;该预览版为可能为最终版本&#xff0c;在很长一段时间内…

HDU - 7028 Decomposition 无向完全图构造欧拉回路

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一张无向完全图&#xff0c;让你构造kkk个长度分别为lil_ili​的路径&#xff0c;这些路径不相交&#xff0c;且∑lin∗(n−1)2\sum l_i\frac{n*(n-1)}{2}∑li​2n∗(n−1)​。 n≤1000,nmod21n\le1000,…

「Azure」数据分析师有理由爱Azure之二-立即申请帐号开始学习之旅

目前关于Azure的学习资料不多&#xff0c;除了官方的文档和Microsoft Learn频道外&#xff0c;几乎没有什么中文性资料可学习&#xff0c;就算有&#xff0c;也是以IT的思维方式来展开介绍&#xff0c;对没有IT背景的数据分析师来说&#xff0c;非常难于适应。本篇给大家带来一…

矩阵快速幂的最简单用法

矩阵快速幂 链接&#xff1a;https://ac.nowcoder.com/acm/contest/1168/K 来源&#xff1a;牛客网 题目描述 这个勇者明明超强却过分慎重&#xff0c;勇者龙宫院圣哉与n名冒险者一起去讨伐神秘魔物&#xff0c;龙宫院圣哉十分谨慎&#xff0c;他只会在最后一刻出手&#xff…

HDU - 7031 Power Station of Art 思维 + 二分图模型

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个完全相同的图&#xff0c;现在两个图的每个点上有一个值valvalval并且有一个颜色colcolcol&#xff0c;颜色只能为红色或黑色&#xff0c;注意两个图只是长得一样&#xff0c;点的权值和颜色并不一定…

DevOps案例研究|史上最能“拜客户教”的公司,是如何做到持续交付的?(第1趴)...

内容来源&#xff1a;DevOps案例深度研究 –Amazon持续交付之道战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

P2261 [CQOI2007]余数求和 整除分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,k≤1e9n,k\le1e9n,k≤1e9 思路&#xff1a; 考虑转换式子&#xff0c;∑i1nkmodi∑i1n(k−⌊ki⌋∗i)n∗k−∑i1n⌊ki⌋∗i\sum_{i1}^{n}k\bmod i\sum_{i1}^n(k-\left \lfloor \frac{k}{i} \right \rfloo…

背包问题——第一篇

一&#xff0c;01背包 最简单也是最经典的背包问题。 首先我们知道背包问题是一种d问题&#xff0c;最重要的就是要去找到他的状态转移方程。而在01背包中转移方程就比较简单了&#xff0c;这里用一个二维数组进行标表示。 ans[i][j]max(ans[i-1][j],ans[i-1][j-v[i]w[i]); 在…

小白开学Asp.Net Core 《十》

小白开学Asp.Net Core 《十》 — — Session、Cookie、Cache&#xff08;老生常谈&#xff09;一、背景在常谈Session和Cookie之前我们先来简单的了解下Http&#xff08;可以说这是必须的&#xff0c;默认大家都了解&#xff09;总结一句话&#xff1a;HTTP是一种无状态的协议&…

P3935 Calculating 整除分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们设s(x)∑i1nf(x)s(x)\sum_{i1}^nf(x)s(x)∑i1n​f(x)&#xff0c;那么答案就是s(r)−s(l−1)s(r)-s(l-1)s(r)−s(l−1)。 容易发现&#xff0c;我们要求的f(x)f(x)f(x)实际上就是xxx的…

Sticks-hdu-1455深度搜索dfs

Sticks 题目传送门。 题目大意是&#xff0c;给你一个数字n代表总共的棍子数量&#xff0c;要做的就是&#xff0c;把这几根棍子拼成长度相同的棍子&#xff0c;并且让所拼成的棍子的长度尽可能地小&#xff0c;也就是拼成的棍子的数量尽可能的多。 在这里很简单的想到要给棍…

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

开发环境&#xff1a;IDE: VSCodeVSCode的扩展插件&#xff1a;vscode-proto3和Clang-Format这两个扩展Windows还需要安装Clang&#xff0c;Windows 64位系统的地址如下&#xff1a;Clang for Windows (64-bit)(http://llvm.org/releases/3.7.0/LLVM-3.7.0-win64.exe)&#xff…