Atcoder Tenka1 Programmer Contest 2019 D Three Colors
题意:
有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案:
- 所有石头都染上了一种颜色
- 令\(R, G, B\)为染了'R', 染了'G', 染了'B'的所有石头的权值和,存在一个三角形的三边为\(R, G, B\)
求合法方案数模\(998244353\)
思路:
考虑总方案数为\(3^n\),我们考虑怎么求出不合法的方案数。令\(dp[i][j]\)表示到第\(i\)个石头,两条短边和为\(j\)的方案数
但是我们注意到,如果\(sum\)是偶数的话,那么:
- \(R = B = \frac{sum}{2}\)和\(B = R = \frac{sum}{2}\)
- \(R = G = \frac{sum}{2}\)和\(G = R = \frac{sum}{2}\)
- \(B = G = \frac{sum}{2}\)和\(G = B = \frac{sum}{2}\)
贡献会重复算一遍,再\(dp\)一次,删掉一份贡献即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 310
const ll p = 998244353;
int n, a[N];
ll f[N * N], g[N * N], all;
int main() {
while (scanf("%d", &n) != EOF) {
ll sum = 0, mid;
all = 1;
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
sum += a[i];
all = (all * 3) % p;
}
mid = sum / 2;
memset(f, 0, sizeof f);
f[0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = sum - a[i]; j >= 0; --j) {
f[j + a[i]] = (f[j + a[i]] + f[j] * 2 % p) % p;
}
}
ll res = 0;
for (int i = 0; i <= mid; ++i) {
res = (res + f[i]) % p;
}
if (sum % 2 == 0) {
memset(g, 0, sizeof g);
g[0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = sum - a[i]; j >= 0; --j) {
g[j + a[i]] = (g[j + a[i]] + g[j]) % p;
}
}
res = (res - g[mid] + p) % p;
}
printf("%lld\n", (all - (res * 3) % p + p) % p);
}
return 0;
}
Atcoder Tenka1 Programmer Contest 2019 D Three Colors的更多相关文章
- Atcoder Tenka1 Programmer Contest 2019 题解
link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...
- Atcoder Tenka1 Programmer Contest 2019题解
传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...
- Tenka1 Programmer Contest 2019 D - Three Colors
Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...
- Atcoder Tenka1 Programmer Contest 2019
C 签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然. #include<bits/stdc++.h> using namespace std; ; ]; char ...
- Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors
题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod ...
- 【AtCoder】Tenka1 Programmer Contest 2019
Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...
- Atcoder Tenka1 Programmer Contest D: IntegerotS 【思维题,位运算】
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_d 给定N,K和A1...AN,B1...BN,选取若干个Ai使它们的或运算值小于等于K ...
- Atcoder Tenka1 Programmer Contest C C - 4/N
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_c 我怀疑我是不是智障.... 本来一直的想法是能不能构造出答案,把N按奇偶分,偶数好办 ...
- Tenka1 Programmer Contest 2019
C:即要使前一部分为白色后一部分为黑色,枚举分割点前缀和计算答案取min即可. #include<bits/stdc++.h> using namespace std; #define l ...
随机推荐
- Centos 创建 docker项目
从gitlab上下载一个docker-compose.yml文件. wget -o docker-compose.yml \ https://raw.githubusercontent.com/sam ...
- python pytest测试框架介绍三
之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例 1.pytest fixture实例1 代码如下 from __future__ import print_f ...
- 【Android】 导入项目报错的解决方案
1.打项目的properties -->android 为其指一个运版本, 2.修改default properties 文件 ,改相应版本等级 3.选中项目,单击右键,选中properties ...
- 9.14.16 Django ORM进阶用法
2018-9-14 14:26:45 ORM 练习题 : http://www.cnblogs.com/liwenzhou/articles/8337352.html 2018-9-14 21:1 ...
- powerdesigner唯一约束设置
双击unique_pos_code
- CodeForces - 586C Gennady the Dentist 模拟(数学建模的感觉)
http://codeforces.com/problemset/problem/586/C 题意:1~n个孩子排成一排看病.有这么一个模型:孩子听到前面的哭声自信心就会减弱:第i个孩子看病时会发出v ...
- Numba:高性能Python编译器
一.简介 Numba是一个开源JIT编译器,它将Python和NumPy代码的子集转换为快速机器代码. 二.主要特点 加速Python功能 Numba使用行业标准的LLVM编译器库在运行时将Pytho ...
- mysql数据库的相关练习题及答案
表结构示意图: 表结构创建语句: class表创建语句 create table ) not null)engine=innodb default charset=utf8; student表创建语句 ...
- 洛谷P2279 消防局的设立 [HNOI2003] 贪心
正解:贪心 解题报告: 传送门! 这题贪心得挺显然的,,,?居然能有蓝,,,是蓝题太水了嘛,,,? 简单说下,这题一看到就能想到,对最低的没被覆盖到的点给它的祖父建一个消防局 没了? 哦这题实现还挺有 ...
- extjs分页
1.本地分页:设置store的proxy属性为pagingmemoryproxy实例 2.远程分页