列表

详情


NC205461. 抽卡

描述

王子连接的国服终于上线啦~
已知王子连接的抽卡系统如下:
共有 个卡池,第 个卡池共有 种卡,每张卡的出货率都是相等的(也就是说该卡池单次抽卡,每种卡出货率是 )。
个卡池中,你有 种卡是自己很想要的。
现在的问题是,如果每个卡池里都单抽一次,能抽到自己想要的卡的概率是多少?
可以证明,这个概率一定可以写成 形式的分数。最后输出该分数在模 意义下的值就可以了。
即输出满足 的最小非负整数

输入描述

第一行输入一个正整数 
第二行输入 个正整数 a_i
第三行输入 个正整数 b_i ,代表第 个卡池的你想要的卡种类数量。

输出描述

一个整数,表示该概率在模  意义下的值。

示例1

输入:

2
3 4
1 1

输出:

500000004

说明:

能抽到自己想要的卡的概率是1/2,由于2*500000004%1000000007=1,故输出500000004。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 152ms, 内存消耗: 3264K, 提交时间: 2020-05-20 16:49:27

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll N=1e5+5;
ll n,a[N],b[N];
ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}
ll inv(ll x){return power(x,mod-2);}
main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++) cin>>b[i];
    ll ans=1;
    for(int i=0;i<n;i++)
        ans=ans*(a[i]-b[i])%mod*inv(a[i])%mod;
    cout<<(mod+1-ans)%mod;
}

C++ 解法, 执行用时: 443ms, 内存消耗: 2336K, 提交时间: 2021-08-06 21:56:08

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
#define mood 1000000007
int main()
{
	int n;
	long long fz=1,fm=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		fm=fm*a[i]%mood;
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
		fz=fz*(a[i]-b[i])%mood;	
	}
	int js=0;
	while(js<mood)
	{
		if((fz+(js-1)*fm)%mood==0)
		{
			break;
		}
		js++;
	}
	cout<<js<<endl;
}

Python3(3.5.2) 解法, 执行用时: 173ms, 内存消耗: 18640K, 提交时间: 2020-05-18 12:13:39

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
mod=1000000007
up=1
for i in range(n): up*=(a[i]-b[i]);up%=mod
down=1
for i in a: down*=i;down%=mod
down=pow(down,mod-2,mod)
ans=1-up*down%mod
while ans<0:ans+=mod
print(ans)

上一题