HDU6747 Rotate 期望

7 篇文章 0 订阅
2 篇文章 0 订阅

题目描述

我们有一个圈,从内到外一共被分成了 n 个环,中间是空的。

我们把从外到内第 i 层环平分成 a[i] 份,其中 a[i] 是偶数,我们把这 a[i] 份黑白染色,第奇数个染成黑色,第偶数个染成白色。

现在我们旋转每一层,每一层都会等概率随机到一个中止位置。

问黑色的联通块数目的期望。两块黑色的区域有交点即算联通。层之间的旋转是相互独立的。

1 ≤ n ≤ 10 , 1 ≤ a i ≤ 1000 , 1 ≤ T ≤ 10 , a i 是 偶 数 且 不 降 1\leq n \leq 10,1 \leq a_{i} \leq 1000,1 \leq T \leq 10,a_{i}是偶数且不降 1n10,1ai1000,1T10,ai

分析

考虑 a i a_{i} ai是偶数且不降,我们可以发现相邻层黑块连边就像一棵树。
联 通 块 的 数 量 = 所 有 的 层 的 黑 块 数 目 − 每 层 之 间 的 黑 边 联通块的数量=所有的层的黑块数目-每层之间的黑边 =
黑块的数目和为 ∑ i = 1 n a i 2 \sum\limits_{i=1}^{n} \frac{a_{i}}{2} i=1n2ai 考虑每层黑边的期望数目
对于任意两层的任意两个黑块,他们相交的概率是 1 a i + 1 a i + 1 \frac{1}{a_{i}} + \frac{1}{a_{i+1}} ai1+ai+11,乘上他们的块数,就是期望的相交个数。
A n s = ∑ i = 1 n a i 2 − ∑ i = 1 n − 1 ( 1 a i + 1 a i + 1 ) a i 2 a i + 1 2 = a [ 1 ] + a [ n ] 4 Ans = \sum\limits_{i=1}^{n} \frac{a_{i}}{2} - \sum\limits_{i=1}^{n-1} (\frac{1}{a_{i}} + \frac{1}{a_{i+1}})\frac{a_{i}}{2}\frac{a_{i+1}}{2}=\frac{a[1] + a[n]}{4} Ans=i=1n2aii=1n1(ai1+ai+11)2ai2ai+1=4a[1]+a[n]

代码

#include <bits/stdc++.h>

#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dep(i,a,b) for(int i=(a);i>=(b);--i)
#define PB push_back
#define CL clear
#define int long long
#define fi first
#define se second
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair<int,int> pii;
const int N = 1e5+10;
const int D = 21;
const int inf = 1e9;
const int mod = 1e9+7;
inline int rd() {
  char ch = getchar(); int p = 0; int f = 1;
  while(ch<'0' || ch>'9'){if(ch=='-') f=-1; ch=getchar();}
  while(ch>='0' && ch<='9'){p=p*10+ch-'0'; ch=getchar();}
  return p*f;
}

int a[N];

int qpow(int x,int k,int mo) {
  int s = 1;
  while(k) {
    if(k&1) s=s*x%mo;
    x=x*x%mo; k>>=1;
    }return s;
}

signed main() {

  int t = rd();
  while(t--) {
    int n = rd();
    for(int i=1;i<=n;i++) a[i] = rd();
    printf("%lld\n",qpow(4ll,mod-2,mod) * (a[1] + a[n]) % mod ); 
    }
    
  return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值