20221013模拟赛题解

改题比赛

A-record

先将原图按颜色划分成多个大小至少为 \(2\) 的连通块,不难发现每个连通块内的颜色永远一样,然后对于每个连通块向外 bfs 扩展,每个点第一次被扩展到后颜色就会开始变化。所以记录一下每个点什么时候被扩展到以及它会跟随哪个连通块,然后询问时判一下时间和奇偶性即可。

B-jewelry

分析

发现 \(n\) 很大,而 \(c_i\) 很小,于是可以开个桶存每个 \(c\) 对应的 \(v\) 的集合。此时很显然可以设 \(dp_{i,j}\) 表示枚举到售价为 \(1 \sim i\),花了 \(j\) 元的最大吸引力,转移方程就呼之欲出了:

\[dp_{i,j}=\max\{dp_{i-1,j-ki}+cal(i,k)\} \\ \]

,其中 \(cal(i,k)\) 表示售价为 \(i\) 的前 \(k\) 大吸引力之和。此时暴力 dp 的复杂度是 \(\mathcal O(n^2)\),能获得 \(20pts\) 的好成绩。

考虑优化,发现其贡献函数的增长率随 \(i\) 增大而而减小,即其二阶导恒为非正,且题目中求的是最大值,因此其满足决策单调性。

因此可以使用分治或二分队列等常见做法优化到 \(\mathcal O(mw\log m)\)

C-impression

分析

首先发现一个显然的结论,把树分成若干份权值和相等的连通块要么没有方案要么只有 \(1\) 种方案。

然后发现每块权值分 \(k\) 时,一个节点 \(u\) 能和其父节点断开的必要条件是 \(k|s_u\)。于是可以设

\[f_i=\sum\limits_{u=1}^{n} [\frac{S}{i}|s_u]\\ \]

,其中 \(s_u\) 表示以 \(u\) 为根的子树大小。

考虑如何计算 \(f_i\),发现若 \(f_i\) 里算进去了 \(u\),设 \(t=\frac{S}{i}\) 则必有

\[t|s_u \Longleftrightarrow s_u=xt \ (x\in \N)\\ t=\frac{S}{i}\Longleftrightarrow S=ti \\ \]

,于是有

\[t|\gcd(s_i,S) \Longleftrightarrow \frac{S}{i}|\gcd(s_i,S) \Longleftrightarrow \frac{S}{\gcd(s_i,S)}|i \\ \]

,于是每次枚举倍数即可。这部分的复杂度相当于是 \(\sum\limits_{i=1}^{n} d(i) \sim n \ln n\)

发现树能合法地分成 \(i\) 份当且仅当 \(f_i=i\),举几个例子能容易发现。

再考虑整体的答案,设 \(dp_i\) 表示最后一次分成 \(k\) 份的方案数,发现每次分的份数一定是上一次的倍数,于是转移还是个 \(n\ln n\),转移方程为:

\[dp_i=[f_i=i]\sum\limits_{i|t} dp_t \]

,最后输出 \(dp_i\) 求和即可。

核心代码

int n,a[MAXN],f[MAXN],dp[MAXN],s[MAXN],ans;vector<int>d[MAXN],tr[MAXN];
void dfs(int u,int fa){
    s[u]=a[u];for(auto v:tr[u]) if(v!=fa) dfs(v,u),s[u]+=s[v];
}int gcd(int x,int y){return y?gcd(y,x%y):x;}
signed main(){
    qread(n);int i,j;for(i=1;i<=n;i++) qread(a[i]);
    for(i=2;i<=n;i++){
        int p;qread(p);
        tr[i].push_back(p);tr[p].push_back(i);
    }dfs(1,0);dp[1]=1;int v;
    for(i=1;i<=n;i++) if((v=(s[1]/gcd(s[i],s[1])))<=n) f[v]++;
    for(i=n;i>=1;i--) for(j=i+i;j<=n;j+=i) f[j]+=f[i];
    for(i=1;i<=n;i++) f[i]=(f[i]==i);
    for(i=1;i<=n;i++){
        if(!f[i]) continue;
        for(j=i+i;j<=n;j+=i) (dp[j]+=dp[i])%=mod;(ans+=dp[i])%=mod;
    }printf("%lld\n",ans);
    return 0;
}

D-graph

大分讨。一下点的度数若无特殊说明均为模 \(3\) 以后的结果。

  • 如果有入度为 \(0\) 的点那么只保留它即可。

  • 如果有两个入度为 \(1\) 的点且他们的路径上只有入度为 \(2\) 的点那么就保留这两个点的路径上的点即可,可以证明如果图中有至少 \(2\) 个入度为 \(1\) 的点就一定会存在如上路径。

  • 如果有仅由入度为 \(2\) 的点构成的环就保留这个环即可。

  • 剩下的情况就是只有 \(1\) 个入度为 \(1\) 的点和一个由入度为 \(2\) 的点构成的森林。首先,这个入度为 \(1\) 的点必然存在,要不然叶子结点的度数不可能是 \(2\)。其次,森林至少有 \(2\) 棵树。因为一棵树对度数为 \(1\) 的点的贡献为 \(2\)。所以考虑找 \(2\) 颗树并分别保留 \(2\) 个叶子结点和路径以及这个入度为 \(1\) 的节点。

特判一下保留下来的点是整个图的情况。

Ex-math

分析

首先发现当取到 \(x=y=1\) 时,\(b=\dfrac{1+1+a}{1}=a+2\),所以有 \(b_{max}\geq a+2\)

另一方面,设 \(b\) 是一个满足条件的正整数,设 \((x,y)\) 是所有满足原式的正整数对中使得 \(x+y\) 最小的一对。

\(x=y\),则 \(b=\dfrac{2x^2+a}{x^2}=2+\dfrac{a}{x^2}\leq 2+a\)

\(x\neq y\),不妨设 \(x>y\),此时原式可以变形成关于 \(x\) 的一元二次方程

\[x^2+by \cdot x+y^2+a=0 \\ \]

,设其另外一个实数解为 \(x'\),由韦达定理可知 \(x'=by-x\in \Z\),又因为 \(x\cdot x'=y^2+a\),即 \(x'=\dfrac{y^2+1}{x}\ >0\),所以 \(x'\) 为正整数,此时,\((x',y)\) 也是满足原式的正整数对,因此

\[x'+y=\frac{y^2+a}{x}+y\geq x+y \\ \]

,于是有 \(x^2\leq y^2+a\),且 \(x\geq y+1\),于是有

\[b=\frac{x^2+y^2+a}{xy}\leq \frac{2(y^2+a)}{xy}\leq \frac{2(y^2+a)}{y(y+1)}=\frac{2y^2}{y^2+y}+\frac{2a}{y(y+1)}<2+a \\ \]

,所以 \(b_{max}\leq 2+a\)

posted @ 2022-10-13 08:07  l_x_y  阅读(61)  评论(0编辑  收藏  举报