Comet OJ - Contest #5

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\n",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\n",1ll*c[i]*fac[i-1]%mod);
}
View Code

result:rank30,还是太菜了

猜你喜欢

转载自www.cnblogs.com/hfctf0210/p/11026997.html