• Comet OJ


    A

    签到

    #include<bits/stdc++.h>
    using namespace std;
    char s[200002];
    int n,a[20];
    int main()
    {
        scanf("%s",s+1);
        n=strlen(s+1);
        for(int i=1;i<=n;i++)a[s[i]-'0']++;
        int ans=min(min(a[1]/3,a[4]/2),a[5]);
        cout<<ans<<endl;
    }
    View Code

    B

    很容易发现2f(x)<=2*9*18=324,枚举<=324的合法因子即可(事实上只要枚举到2*9*2=36),但我预处理合法因子复杂度也一样了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll n;
    bool vis[325];
    vector<int>G;
    int judge(int x)
    {
        int fx=x%10+x/10%10+x/100;
        return fx==x/2;
    }
    int main()
    {
        int Q;scanf("%d",&Q);
        for(int i=1;i<=324;i++)if(judge(i))G.push_back(i);
        while(Q--)
        {
            scanf("%lld",&n);
            int ans=0;
            for(int i=0;i<G.size();i++)if(n%G[i]==0)ans++;
            printf("%d
    ",ans);
        }
    }
    View Code

    C

    记录一个当前能放的最小深度的指针,然后把可行的点全部存在set里搞搞就行了

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+7;
    int n,mx,sum[N],dep[N],a[N];
    vector<int>G[N],vec[N];
    set<int>S;
    void dfs(int u,int fa)
    {
        dep[u]=dep[fa]+1;
        mx=max(mx,dep[u]),vec[dep[u]].push_back(u);
        for(int i=0;i<G[u].size();i++)if(G[u][i]!=fa)dfs(G[u][i],u);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x);
        dfs(1,0);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[a[i]+1]++;
        int p=1;
        while(p<=n&&!sum[p])
        {
            for(int i=0;i<vec[p].size();i++)S.insert(vec[p][i]);
            p++;
        }
        for(int i=1;i<=n;i++)
        {
            int u=*S.begin();S.erase(u);
            printf("%d ",u);
            sum[a[u]+1]--;
            while(p<=n&&!sum[p])
            {
                for(int i=0;i<vec[p].size();i++)S.insert(vec[p][i]);
                p++;
            }
        }
    }
    View Code

    D

    据说CZDdalao暴力O(nq)过了?tql!然而我不会,也暂时没订正。

    E

    还是不会,做过Lnoi2019一道简化了不知道多少的版本,不过和这个思路差之千里。p是单次消失的概率,q为单次不消失的概率,设有i个人时,第1个人最后消失的概率是f[i],然后第一个人在第j次消失的概率是pqj(1-qj)i-1,然后二项式定理展开后再用等比数列求和,得到f[i]=pΣC(i-1,j-1)(-1)j-1/(1-qj),然后组合数拆项,NTT求值即可。然后再设n个人时第i个人最后消失的概率是g[i],实际上等于前面i-1个人进行一轮,剩余人中第1个人最后消失,于是就有g[i]=ΣC(i-1,j)piqn-i-1f[n-j],同样这个也可以组合数拆项+NTT去求解。复杂度O(nlogn)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=804000,mod=998244353;
    int n,nn,p,q,fac[N],inv[N],R[N],a[N],b[N],c[N],d[N];
    int qpow(int a,int b)
    {
        int ret=1;
        while(b)
        {
            if(b&1)ret=1ll*ret*a%mod;
            a=1ll*a*a%mod,b>>=1;
        }
        return ret;
    }
    void NTT(int*a,int f)
    {
        for(int i=0;i<nn;i++)if(i<R[i])swap(a[i],a[R[i]]);
        for(int i=1;i<nn;i<<=1)
        {
            int wn=qpow(3,mod/(i<<1));
            if(f==-1)wn=qpow(wn,mod-2);
            for(int j=0;j<nn;j+=i<<1)
            for(int k=0,w=1;k<i;k++,w=1ll*w*wn%mod)
            {
                int x=a[j+k],y=1ll*a[i+j+k]*w%mod;
                a[j+k]=(x+y)%mod,a[i+j+k]=(x-y+mod)%mod;
            }
        }
        if(f==1)return;
        int invn=qpow(nn,mod-2);
        for(int i=0;i<nn;i++)a[i]=1ll*a[i]*invn%mod;
    }
    int main()
    {
        fac[0]=1;for(int i=1;i<N;i++)fac[i]=1ll*fac[i-1]*i%mod;
        inv[N-1]=qpow(fac[N-1],mod-2);for(int i=N-1;i;i--)inv[i-1]=1ll*inv[i]*i%mod;
        scanf("%d%d%d",&n,&p,&q),p=1ll*p*qpow(q,mod-2)%mod,q=(mod+1-p)%mod;
        int L=0;for(nn=1;nn<=(n<<1);nn<<=1)L++;
        for(int i=0;i<nn;i++)R[i]=(R[i>>1]>>1)|((i&1)<<L-1);
        for(int i=0;i<=n;i++)
        {
            a[i]=1ll*fac[i]*(1-qpow(q,i+1)+mod)%mod;
            a[i]=qpow(a[i],mod-2);
            if(i&1)a[i]=mod-a[i];
            if(i)b[i]=inv[i-1];
        }
        NTT(a,1),NTT(b,1);
        for(int i=0;i<nn;i++)a[i]=1ll*a[i]*b[i]%mod;
        NTT(a,-1);
        for(int i=0;i<=n;i++)a[i]=1ll*a[i]*p%mod*fac[i-1]%mod;
        for(int i=0;i<=n;i++)
        {
            c[i]=1ll*a[n-i]*qpow(p,i)%mod*inv[i]%mod;
            if(i)d[i]=1ll*qpow(q,i-1)*inv[i-1]%mod;
        }
        NTT(c,1),NTT(d,1);
        for(int i=0;i<nn;i++)c[i]=1ll*c[i]*d[i]%mod;
        NTT(c,-1);
        for(int i=1;i<=n;i++)printf("%d
    ",1ll*c[i]*fac[i-1]%mod);
    }
    View Code

    result:rank30,还是太菜了

  • 相关阅读:
    第二次作业
    《自动化技术中的进给电气传动》读书笔记1.1-1.2
    证券投资分析
    微信官方文档概述
    联想拯救者Y7000电池无法充电问题
    Ubuntu用户权限管理
    证券市场基础知识
    Markdown All in One使用教程
    Markdown学习笔记
    第九周
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/11026997.html
Copyright © 2020-2023  润新知