2020年百度之星初赛一题5

Rotate

 

 Accepts: 207

 

 Submissions: 272

 Time Limit: 2000/1000 MS (Java/Others)

 

 Memory Limit: 32768/32768 K (Java/Others)

Problem Description

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

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

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

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

Input

第一行一个正整数 test(1 \le test \le 10)test(1≤test≤10) 表示数据组数。

对于每组数据,第一行一个正整数 n(1 \le n \le 10)n(1≤n≤10)。

接下来一行 nn 个正整数 a[i](2 \le a[i] \le 1000)a[i](2≤a[i]≤1000),a[i]a[i] 为偶数,另外保证 aa 序列不降。

Output

对于每组数据,一行一个数表示答案,由于答案 A/BA/B 中的 ABAB 可能很大,请输出 A/B \mod 10^9+7A/Bmod109+7,假设 A/BA/B 为最简分数,A/B \mod 10^9+7 = A * B^{-1} \mod 10^9+7A/Bmod109+7=A∗B−1mod109+7,B^{-1}B−1 为满足 B^{-1}*B \mod 10^9+7 = 1B−1∗Bmod109+7=1 的整数。

Sample Input

3
2
2 2
2
2 6
4
10 230 666 1000

Sample Output

1
2
500000256

样例解释
对于第一组样例,第一个环和第二个环各有一半是黑的,他们的黑色部分必然有交点,所以期望的联通块数目为 1。
对于第二组样例,旋转第一个环,只在几个特定角度上第一个环的黑色部分和第二个环的三个黑色部分都有交点,大部分情况下都只和两个黑色部分有交点,因为算期望,所以几个特定角度对答案没有影响,答案为 2。

上面是题面,然后现在我们来分析这个题目,首先我看到的一点是环的编号是从外往内编号的,然后我们就可以来分析了,首先题目说了,a_i是递减的,那么就可以保证同一层的黑块不会连在一起,所以我们就可以来统计黑块的个数了,我们来看每一层,假设a_i的黑块长度为1,那么a_{i+1}黑块的长度为a_i/a_{i+1},那么对于a_{i+1}层,一个黑白整块的长度为2*a_i/a_{i+1},那么a_i层的黑块和a_{i+1}层黑块不重合只能在(a_i/a_{i+1},2*a_i/a_{i+1}-1),那么不重合的概率为(2*a_i/a_{i+1}-1)/(2*a_i/a_{i+1}),这个对于a_i层的一个黑块来说的,a_i层一共有a_i/2个黑块,那么该层独立块数目的期望为(a_i/a_{i+1}-1)/(2*a_i/a_{i+1})*(a_i/2)=(a_i-a_{i+1})/4,这样算每一层,最内层是a_n/2,加在一起就是(a_1+a_n)/4。最后再取模数就是答案了。这个题我之前不会,是清华大佬教我的。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll quick(ll a)
{
    ll M=mod-2,ans=1;
    while(M)
    {
        if(M&1)
            ans=ans*a%mod;
        a=a*a%mod;
        M/=2;
    }
    return ans%mod;
}
int main()
{
    ll W=quick(4LL);
    int te;
    cin>>te;
    while(te--)
    {
        int n;
        cin>>n;
        ll ans=0;
        for(int i=0; i<n; i++)
        {
            int a;

            cin>>a;
            if(i==0||i==n-1)
                ans+=a;
        }
        if(n==1)cout<<n/2<<endl;
        else
        cout<<ans*W%mod<<endl;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值