记录编号 584699 评测结果 AAAAAAAAAAAAAAAA
题目名称 魔药 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.119 s
提交时间 2023-11-14 17:17:02 内存使用 7.16 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long N = 1e6+10,mod = 1e9+7;
int n,m,k,p = 1e9+7;
ll s[N] = {1,1},ans;
char c[N];
ll pow(ll x,int y){
    if(y == 0)return 1;
    ll ans = pow(x,y/2);
    if(y % 2)return (ans * ans) % mod * x % mod;
    else return (ans * ans) % mod;
}//费马小定理求逆元 
ll C(int x,int y){
    return (s[x] * pow(s[x-y],p-2)) % mod * pow(s[y],p-2) % mod;
}//除法不符合,需要逆元 
int main(){
    freopen("sleeping.in","r",stdin);
    freopen("sleeping.out","w",stdout);
    scanf("%lld%lld%s",&n,&m,c+1);
    for(int i = 1;i <= n;i++)if(c[i] == '1')k++;
    for(int i = 2;i <= n;i++)s[i] = s[i-1] * i % mod;
    if(m > n){
        printf("0 %lld\n",C(n,k));
        return 0;
    }
    //排列数 
    if(m % 2 == 0)ans = 2 * C(k-1,k-m/2) * C(n-k-1,k-m/2) % mod;//偶数 
    else ans = (C(k-1,k-m/2) * C(n-k-1,n-k-m/2-1) % mod + (C(k-1,k-m/2-1) * C(n-k-1,n-k-m/2))) % mod;
    //奇数 
//    cout<<ans<<endl;
    long long s = C(n,k) - ans;
    if(s < 0)s += mod;
    printf("%lld %lld\n",ans,s);
    
    return 0;
    
}