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; }
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); } }
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++; } } }
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); }
result:rank30,还是太菜了