题意:

有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案:

  • 所有石头都染上了一种颜色
  • 令\(R, G, B\)为染了'R', 染了'G', 染了'B'的所有石头的权值和,存在一个三角形的三边为\(R, G, B\)

求合法方案数模\(998244353\)

思路:

考虑总方案数为\(3^n\),我们考虑怎么求出不合法的方案数。令\(dp[i][j]\)表示到第\(i\)个石头,两条短边和为\(j\)的方案数

但是我们注意到,如果\(sum\)是偶数的话,那么:

  1. \(R = B = \frac{sum}{2}\)和\(B = R = \frac{sum}{2}\)
  2. \(R = G = \frac{sum}{2}\)和\(G = R = \frac{sum}{2}\)
  3. \(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的更多相关文章

  1. Atcoder Tenka1 Programmer Contest 2019 题解

    link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...

  2. Atcoder Tenka1 Programmer Contest 2019题解

    传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...

  3. Tenka1 Programmer Contest 2019 D - Three Colors

    Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...

  4. Atcoder Tenka1 Programmer Contest 2019

    C 签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然. #include<bits/stdc++.h> using namespace std; ; ]; char ...

  5. Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors

    题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod ...

  6. 【AtCoder】Tenka1 Programmer Contest 2019

    Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...

  7. Atcoder Tenka1 Programmer Contest D: IntegerotS 【思维题,位运算】

    http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_d 给定N,K和A1...AN,B1...BN,选取若干个Ai使它们的或运算值小于等于K ...

  8. Atcoder Tenka1 Programmer Contest C C - 4/N

    http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_c 我怀疑我是不是智障.... 本来一直的想法是能不能构造出答案,把N按奇偶分,偶数好办 ...

  9. Tenka1 Programmer Contest 2019

    C:即要使前一部分为白色后一部分为黑色,枚举分割点前缀和计算答案取min即可. #include<bits/stdc++.h> using namespace std; #define l ...

随机推荐

  1. expect小工具,在postgresql中执行sql的shell脚本

    脚本内容: #!/usr/bin/expect set database [lindex $argv 0] set username [lindex $argv 1] set password [li ...

  2. 把握这两点,抢占下一个电商风口|2016最新中国电商App排名&研究报告

    序言 电商,是随着中国互联网经济的持续发展所成长起来的.淘宝.京东这些电商从交易额和影响力上看都位列中国最为成功.最具话题性的互联网企业之中.尽管近几年中国经济有所放缓,但中国消费市场的增长速度仍有望 ...

  3. Canvas裁剪Clip和Region、RegionIterator

    extends:http://blog.csdn.net/lonelyroamer/article/details/8349601 裁剪功能由Canvas提供的一系列的clip...方法 和quick ...

  4. 使用find命令按条件查找多个文件并且拷贝至指定目录

    命令格式如下 find / \( -name "*.war" -o -name "*.jar" \) | xargs -i cp {} ${wardir} 当需 ...

  5. 从UE(用户体验)到道家誓学再到李小龙

    公司大Boss经常会给我做技术培训,感觉他什么都知道,也挺喜欢听他的课. 本文记录可能比较天马行空,我的语文比较差,很难把自己想表达的说出来,为此我就是记录一样关键字,可能这样还会更好些 背景是讲用户 ...

  6. Git 使用篇一:初步使用GitHub,下载安装git,并上传项目

    首先在MAC上怎么操作. 在gitHub创立一个账户,在创立一个项目,这就不用我说了对吧. 创建完之后是这样的: 接下来,我们打开https://brew.sh 这是下载homebrew的网站,hom ...

  7. hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]

    题目链接:https://hihocoder.com/problemset/problem/1334 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N wo ...

  8. ZOJ 2760 - How Many Shortest Path - [spfa最短路][最大流建图]

    人老了就比较懒,故意挑了到看起来很和蔼的题目做,然后套个spfa和dinic的模板WA了5发,人老了,可能不适合这种刺激的竞技运动了…… 题目链接:http://acm.zju.edu.cn/onli ...

  9. 【紫书】Quadtrees UVA - 297 四叉树涂色

    题意:前序遍历给出两个像素方块.求两个方块叠加后有几个黑色格子. 题解:每次读进来一个方块,就在二维数组上涂色.每次把白色涂黑就cnt++: 具体递归方法是以右上角坐标与边长为参数,每次通过几何规律往 ...

  10. Oracle性能优化之普通用户使用dbms_xplan包需要有的权限

    普通用户使用dbms_xplan包查看执行计划需要对v$sql.v$sql_plan.v$session及v$sql_plan_statistics_all这四个视图同时具有select权限. 如果普 ...