NC224207. 擅长解密的小红同学
描述
输入描述
一行共 10 个非负整数 ,分别代表 '0'~'9' 每个数字的出现次数。
,且保证所有 不会全为0。
输出描述
小红尝试次数的期望,对 取模。可以证明,该期望一定为有理数。如果该期望为分数,请输出分数取模的值。分数取模的定义: ,等价于
示例1
输入:
0 2 0 0 0 0 0 0 0 0
输出:
1
说明:
已知数字 1 出现了 2 次,那么密码只有可能是 "11" ,小红只需要一次输入即可破解。
示例2
输入:
1 1 0 0 0 0 0 0 0 0
输出:
2
说明:
已知数字 0 出现了 1 次,数字 1 出现了 1 次,那么密码可能是 "01" 或者 "10" 。由于密码可能会重置,因此小红每次尝试的成功概率为 。
尝试次数的期望为
C++ 解法, 执行用时: 69ms, 内存消耗: 39544K, 提交时间: 2021-08-07 22:44:59
#include<bits/stdc++.h> using namespace std; #define Mod 1000000007 #define For(i,x,y)for(i=x;i<=(y);i++) int fac[10000005],a[11]; int ksm(int x,int y) { return(!y?1:1LL*ksm(1LL*x*x%Mod,y>>1)*(y&1?x:1)%Mod); } int main() { int i; For(i,0,9)cin>>a[i],a[10]+=a[i]; fac[0]=1; For(i,1,a[10])fac[i]=1LL*fac[i-1]*i%Mod; a[10]=fac[a[10]]; For(i,0,9)a[10]=1LL*a[10]*ksm(fac[a[i]],Mod-2)%Mod; cout<<a[10]; return 0; }
pypy3 解法, 执行用时: 186ms, 内存消耗: 99516K, 提交时间: 2022-10-21 18:05:34
cnt=[int(x) for x in input().split()] mod=10**9+7 n=sum(cnt) f=[1]*(n+1) for i in range(1,n+1): f[i]=f[i-1]*i f[i]%=mod res=f[sum(cnt)] for i in range(10): res*=pow(f[cnt[i]],mod-2,mod) res%=mod print(res)