CSP-J 2025 多边形 题解

📅 2026/8/19 12:02:22
CSP-J 2025 多边形 题解
题目大意给定 n 根木棍选出若干根木棍子集下标集合不同就算不同方案要求选中木棍数量m3设选中集合总长度 S集合最长边 mx满足S2*maxl求合法子集数目对模数998244353取模。解题思路暴力核心思路特判全部木棍相等任意选≥3 根都合法杨辉三角预处理组合数直接求和。n20用二进制暴力枚举全部子集统计满足m3并且sum2*mx的子集。暴力代码#includebits/stdc.husingnamespacestd;intc[5005][5005];voidyhsj(intn){c[0][0]1;c[1][0]c[1][1]1;for(inti2;in;i){for(intj0;ji;j){c[i][j](c[i-1][j]c[i-1][j-1])%998244353;}}}intmain(){intn;cinn;vectorinta(n);boolftrue;for(inti0;in;i){cina[i];if(i0a[i]!a[0])ffalse;}if(f){yhsj(n);longlongans0;for(intm3;mn;m){ans(ansc[n][m])%998244353;}coutans;return0;}elseif(n20){longlongans0;for(inti1;i(1n);i){intcnt0;longlongsum0;intmx0;for(intj0;jn;j){if(i(1j)){cnt;suma[j];mxmax(mx,a[j]);}}if(cnt3sum2*mx*1ll){ans;ans%998244353;}}coutans;return0;}return0;}AC思路用总非空子集减去不合法方案把数组排序枚举每根木棍作为子集最大值强制必选它只需从前面木棍挑选。01 背包统计前面木棍凑出各总和的子集数累加总和不超过当前木棍长度的方案得到全部不合法集合。用总子集减去全部坏方案再剔除只选 1 根的情况减法处理负数取模得到最终合法答案。AC代码#includebits/stdc.husingnamespacestd;intn;inta[5005];intdp[25000005];intsum0,ans1;intmain(){cinn;for(inti1;in;i){cina[i];}for(inti1;in;i){ans(ans1)%998244353;}ans--;sort(a1,an1);dp[0]1;for(inti1;in;i){for(intj1;ja[i];j){sum(sumdp[j])%998244353;}for(intj5000;ja[i];j--){if(ja[i])dp[j](dp[j]1)%998244353;elsedp[j](dp[j]dp[j-a[i]])%998244353;}}if(ans-sum-n0){cout(ans-sum-n)%998244353998244353;}else{cout(ans-sum-n)%998244353;}return0;}