• 牛客练习赛20


    A. 礼物

    枚举一元奥利奥的个数,计算2元的个数,现在需要解决从N种物品中,取x个的方法数,把N个种类看作N个盒子,奥利奥看作球,就是经典球盒模型了。

    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    typedef long long ll;
    using namespace std;
    int MX = 300002;
    const int N = 2000000;
    ll n,m,k,p,ans;
    ll q_pow(ll a,ll b) {
        a%=p;
        ll ans=1LL;
        while(b){
            if(b&1) ans=(ans*a)%p;
            a=(a*a)%p;
            b>>=1LL;
        }
        return ans;
    }
    ll fc[N],f[2222][2222];
    void init() {
        fc[0]=1;
        rep(i,1,2002)fc[i]=((fc[i-1]%p)*i)%p;
    
       // rep(i,0,2002) f[i][0]=f[i][i]=1;
        //rep(i,1,2002)rep(j,1,i) f[i][j] = (f[i-1][j-1]+f[i-1][j])%p;
    }
    ll C(ll n, ll m) {
        if(n==m)return 1LL;
        return ((((fc[n]%p)*q_pow(fc[m],p-2LL))%p)%p*(q_pow(fc[n-m],p-2LL)%p))%p;
    
        return f[n][m];
    }
    int T;
    int main() {
        scanf("%d",&T);
        while(T--){
            ans=0;
            scanf("%lld%lld%lld%lld",&n,&m,&k,&p);
            init();
            if(!n&&!m) {
                puts("0");
                continue;
            }
            if(!n) {
                if(k%2==0){
                    k/=2;
                    printf("%lld
    ",C(k+m-1LL,m-1LL)%p);
                }
                else puts("0");
                continue;
            }
            if(!m) {
                printf("%lld
    ",C(k+n-1LL,n-1LL)%p);
                continue;
            }
            for(ll x=0LL;x<=k;++x){
                ll y = (k-x)/2LL;
                if(y>=0LL&&x+2LL*y==k) ans = (ans%p+(((C(x+n-1LL,n-1LL)%p)*C(y+m-1LL,m-1LL)%p)%p)%p)%p;
            }
            printf("%lld
    ",(ans+p)%p);
        }
        return 0;
    }
    

    B. 麻婆豆腐

    设集合内最后一个硬为1的概率是x,其余元素异或起来是1的概率为p,则有x*(1-p) + p*(1-x) = 0.5, 可解得一个为0.5,另一个为任意值,即当集合存在一个x=0.5时,则这个集合异或为1的概率为0.5。即求出所有包含0.5的集合的数目。

    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    #define frep(i,a,b) for(int i=a;i>=b;--i)
    #define pb push_back
    #define mkp make_pair
    #define mem(W) memset(W,0,sizeof(W))
    typedef long long ll;
    using namespace std;
    int n, m;
    double x;
    ll f[66];
    int main() {
        int T;
        f[0]=1; rep(i,1,60) f[i]=(f[i-1]<<1LL);
        scanf("%d",&T);
        while(T--) {
            scanf("%d",&n); m = 0;
            rep(i,1,n){
                scanf("%lf",&x);
                if(x == 0.5) ++m;
            }
            printf("%lld
    ",f[n]-f[n-m]);
        }
        return 0;
    }
    

    E. 托米历险记

    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    using namespace std;
    int n,a[101001],f,A[111];
    void dfs(int x,int a25,int a50){
        if(x==n+1) {
            if(a25>=0&&a50>=0)f=1;
            return;
        }
        if(f)return;
        if(a[x]==25) {dfs(x+1,a25+1,a50);if(f)return;}
        else if(a[x]==50){
                if(f)return;
            if(a50-1>=0)dfs(x+1,a25,a50-1+1);
            if(f)return;
            if(a25-2>=0)dfs(x+1,a25-2,a50+1);
            if(f)return;
        }
        else {
            if(a50-2>=0)dfs(x+1,a25,a50-2);
            if(f)return;
            if(a50-1>=0&&a25-2>=0)dfs(x+1,a25-2,a50-1);
            if(f)return;
            if(a25-4>=0)dfs(x+1,a25-4,a50);
            if(f)return;
        }
        return;
    }
    int main() {
        scanf("%d",&n);
        rep(i,1,n) scanf("%d",&a[i]);
        dfs(1,0,0);
        if(f)puts("YES");
        else puts("NO");
        return 0;
    }
    

    F. 填数字

    简单贪心。 先用最少的钱不断重复,凑出最长位数。从高到低,把每一位在钱数允许的情况下尽量改大。

    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    typedef long long ll;
    using namespace std;
    int n,a[99],idx,b[1000007],cnt;
    
    int main() {
        scanf("%d",&n);
        rep(i,1,9)scanf("%d",&a[i]);
        idx=9;
        for(int i=8;i>=1;--i)if(a[idx]>a[i])idx=i;
        while(n-a[idx]>=0) n-=a[idx],b[cnt++]=idx;
        if(cnt==0) return puts("-1"),0;
        rep(i,0,cnt-1){
            for(int j=9;j>b[i];--j)if(a[j]<=n+a[b[i]]){
                n+=a[b[i]];
                n-=a[j];
                b[i]=j;
            }
        }
        sort(b,b+cnt);
        for(int i=cnt-1;i>=0;--i)printf("%d",b[i]);puts("");
        return 0;
    }
    

      

  • 相关阅读:
    解决ssh或ftp下root用户认证失败问题
    setsockopt IP_ADD_MEMBERSHIP error!No such device的解决方案
    嵌入式Linux软件工程师面试题一
    00.嵌入式Linux开发环境搭建
    这个是豆瓣查书的api
    CentOS7.x安装MongoDB3.2.3教程
    Linux(Centos7)yum安装最新mysql
    解决npm速度慢的问题!!!
    windows下Gulp入门详细教程
    hibernate中hql查询
  • 原文地址:https://www.cnblogs.com/RRRR-wys/p/9201699.html
Copyright © 2020-2023  润新知