列表

详情


NC213791. 永远亭的小游戏

描述

蓬莱山辉夜由于整天宅在家,整个人都已经变成了一只废neet姬了。于是,她找来了铃仙和因幡帝,来玩一个小游戏。
辉夜拿出一个长度为的数组,铃仙拿出一个长度为的数组,因幡帝拿出一个长度为的数组
她们等概率的在各自的数组中取一个数。辉夜想知道这三个取出的数的乘积的期望是多少?
可以证明,这个期望一定是有理数,可以写成的形式。请输出这个分数对取模的值。
提示:分数取模的值的意义是在区间里找到一个数满足取模为
提示2:本题输入数据较大,推荐使用scanf或更快的输入方式

输入描述

第一行输入三个正整数,用空格隔开。分别代表辉夜、铃仙和因幡帝拿到的数组长度。 
第二行输入个正整数,代表辉夜拿到的数组。
第三行输入个正整数,代表铃仙拿到的数组。
第四行输入个正整数,代表因幡帝拿到的数组。
数据范围:

输出描述

最后乘积的期望对取模的值。

示例1

输入:

2 2 2
1 2
1 1
2 4

输出:

500000008

说明:

三个人各取一个数的组合有以下8种:
1*1*2=2
1*1*4=4
1*1*2=2
1*1*4=4
2*1*2=4
2*1*4=8
2*1*2=4
2*1*4=8
(2+4+2+4+4+8+4+8)/8=36/8=4.5
最终的乘积期望是4.5,即9/2,由于(500000008*2)%1000000007=9,因此输出500000008

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 315ms, 内存消耗: 504K, 提交时间: 2020-11-22 18:52:40

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1e3+5,mod=1e9+7;
ll input(int n)
{
	ll sum=0,x;
	for(int i=1;i<=n;i++){
		scanf("%lld",&x);
		sum+=x;
		sum%=mod;
	}
	return sum;
}
ll q_pow(ll a, ll b)
{
	ll res=1;
	while(b){
		if(b&1)res=(res*a)%mod;
		b>>=1;
		a=(a*a)%mod;
	}
	return res;
}
int main()
{
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	ll s1=input(n);
	ll s2=input(m);
	ll s3=input(k);
	//cout<<s1*s2*s3<<'\n';
	printf("%lld\n",((s1*s2)%mod*s3)%mod*q_pow((((1ll*n*m)%mod)*k)%mod,mod-2)%mod);
  return 0;
}

Python3(3.9) 解法, 执行用时: 957ms, 内存消耗: 206140K, 提交时间: 2021-02-22 16:12:41

import math
def qpow(a,n,mod):
    res=1
    while n:
        if n&1:
            res=res*a%mod
        a=a*a%mod
        n>>=1
    return res
nmk=list(map(int,input().split()))
n=list(map(int,input().split()))
m=list(map(int,input().split()))
k=list(map(int,input().split()))
mod=int(1e9+7)
cnt=nmk[0]*nmk[1]%mod*nmk[2]%mod
res=sum(n)*sum(m)%mod*sum(k)%mod
t=math.gcd(res,cnt)
res//=t
cnt//=t
print(res*qpow(cnt,mod-2,mod)%mod)

上一题