Solution -「Tenka1 2019 D」Three Colors
\(\mathcal{Description}\)
Link.
给定 \(\{a_n\}\),把每个元素划分入可重集 \(R,G,B\) 中的恰好一个,求满足 \(\sum R,\sum G,\sum B\) 能够作为正面积三角形三边的划分方案数。对 \(998244353\) 取模。
\(n,a_i\le300\)。
\(\mathcal{Solution}\)
不妨令 \(\sum R,\sum G\le\sum B\)(注意 \(\sum R\) 和 \(\sum G\) 不钦定偏序关系),正难则反,考虑用总方案数 \(3^n\) 减去 \(3\) 倍 \(\sum R+\sum G\le \sum B\) 的方案数。令 \(f(i,j)\) 表示考虑了前 \(i\) 个数,\(\sum R+\sum G=j\) 的方案数。转移显然:
\]
不过,这样求出来的方案数中包含了 \(R=\varnothing\) 或 \(Q=\varnothing\) 的方案数,因而 \(\sum R+\sum G=\sum B\) 的情形会算重。把转移方程的系数 \(2\) 去掉再来一遍补上多算的答案即可。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
const int MAXN = 300, MOD = 998244353;
int n, S, a[MAXN + 5], f[MAXN * MAXN + 5];
inline int mul ( const long long a, const int b ) { return a * b % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int qkpow ( int a, int b ) {
int ret = 1;
for ( ; b; a = mul ( a, a ), b >>= 1 ) ret = mul ( ret, b & 1 ? a : 1 );
return ret;
}
int main () {
scanf ( "%d", &n );
for ( int i = 1; i <= n; ++ i ) scanf ( "%d", &a[i] ), S += a[i];
f[0] = 1;
for ( int i = 1; i <= n; ++ i ) {
for ( int j = S >> 1; j >= a[i]; -- j ) {
f[j] = add ( f[j], mul ( 2, f[j - a[i]] ) );
}
}
int ans = qkpow ( 3, n );
for ( int i = 0; i <= S >> 1; ++ i ) ans = sub ( ans, mul ( 3, f[i] ) );
if ( S & 1 ) return printf ( "%d\n", ans ), 0;
for ( int i = 0; i <= S >> 1; ++ i ) f[i] = 0;
f[0] = 1;
for ( int i = 1; i <= n; ++ i ) {
for ( int j = S >> 1; j >= a[i]; -- j ) {
f[j] = add ( f[j], f[j - a[i]] );
}
}
ans = add ( ans, mul ( 3, f[S >> 1] ) );
printf ( "%d\n", ans );
return 0;
}
\(\mathcal{Details}\)
正难则反吖!
Solution -「Tenka1 2019 D」Three Colors的更多相关文章
- Solution -「ExaWizards 2019 C」Snuke and Wizards
\(\mathcal{Description}\) Link. 给定一个长度为 \(n\) 的字符串 \(s\),每个字符上初始有一张卡片.\(q\) 次操作,每次指定 \(s\) 中字符为 ...
- 「JOISC 2019 Day3」穿越时空 Bitaro
「JOISC 2019 Day3」穿越时空 Bitaro 题解: 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. 问题变成二维平面上 ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3032. 「JOISC 2019 Day1」馕
LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- 【LOJ】#3031. 「JOISC 2019 Day1」聚会
LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
随机推荐
- vue3.0+ts+setup语法糖props写法
写法一 import defaultImg from '@/assets/images/defaultImg.png' const props = defineProps({ src: { type: ...
- IE播放音频踩坑之路---待修改
在其他浏览器都是兼容的!在IE9就是显示一个黑色的框上面有个X 音乐无法播放 要显示播放界面的话,要添加 controls 属性(控件属性)例子:<audio src="xxx.m ...
- Git 的配置 config
Git 的配置 config Git 的配置 config config 文件简述 config 文件位置 信息查询 修改 config 文件 编辑配置文件 增加指定配置项 删除指定配置项 自助餐 ...
- iframe页面总是提示需要重新登录怎么办
原文链接:iframe页面二次登录问题 生产问题 问题背景 由于历史原因,公司内部系统有一些页面是基于iframe嵌入的其他系统的页面,之前一直运行正常,最近不知什么原因接连出现访问所有iframe页 ...
- SpringBoot2.4.2下配置Lettuce使用Redis
1. Springboot2.4.2下对Redis的基础集成 1.1 maven添加依赖 <dependency> <groupId>org.springframework.b ...
- access注入 - 联合查询
1.access数据库简介 简介:Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两 ...
- 《剑指offer》面试题14- I. 剪绳子
问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]*k[1]* ...
- 通过UI库深入了解Vue的插槽的使用技巧
Vue官网对于插槽的介绍比较简略,插槽本身也比较"烧脑",很容易看晕,我就一直没看懂,直到 使用了element-plus的组件的插槽. 其实我们可以换一个角度来理解插槽,就会豁然 ...
- netty系列之:好马配好鞍,为channel选择配套的selector
目录 简介 netty服务的基本构建方式 EventLoopGroup channel 多种构建方式 其他的channel 总结 简介 我们知道netty的基础是channel和在channel之上的 ...
- Ultimaker2+使用指南
USB打印 使用最新的官方软件即可进行USB3D打印. 使用时在选项上进行预热以及x,y,z重新归零定位,每次开始都要做. SD卡打印 比较方便,因为电脑可能拿去做其他事情. 打印机堵塞 退出耗材时候 ...