NC205461. 抽卡
描述
输入描述
第一行输入一个正整数 。第二行输入 个正整数 。第三行输入 个正整数 ,代表第 个卡池的你想要的卡种类数量。
输出描述
一个整数,表示该概率在模 意义下的值。
示例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)