题意: 有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案: 所有石头都染上了一种颜色 令\(R, G, B\)为染了'R', 染了'G', 染了'B'的所有石头的权值和,存在一个三角形的三变为\(R, G, B\) 求合法方案数模\(998244353\) 思路: 考虑总方案数为\(3^n\),我们考虑怎么求出不合法的方案数.令\(dp[i][j]\)表示到第\(i\)个石头,两条短边和为\(j\)的方案数 但是我们注意到,如果\…
link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define rep(i,x,y) for (int i=(x);i<=(y);i++) using namespace std; ; int n,cnt0[N],cnt1[N],ans; char s[N]; int main(){ scanf(); rep (i,,n) cnt0[i]+=s[i]=='#',c…
传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in","r",stdin); n=read(),read(s),res=0x3f3f3f3f; fp(i,1,n){ sum[i][0]=sum[i-1][0],sum[i][1]=sum[i-1][1]; ++sum[i][s[i]=='#']; } fp(i,0,n)cmin(r…
Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意当某两条边都为sum/2的时候,dp会多算一次,要减去多算的方案数,多算的方案数也可以用dp求 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc++.h> u…
C 签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然. #include<bits/stdc++.h> using namespace std; ; ]; char s[N]; int main() { scanf("%d",&n); scanf(); ;i<=n;i++) if(s[i]=='.') { f[i][]=f[i-][]; f[i][]=min(f[i-][],f[i-][])+; } else{ f[i][]=f[i-]…
题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod p\)意义下,多项式中存在\((x^p - x)\)这个因式,那么这个质数\(p\)也是可以的 显然\(p \leq n\),那么我们只要枚举每个\(\leq n\)的质数,做模\(p\)意义下的多项式除法,判断余数是否为\(0\)即可. 证明: 充分性:考虑\(p\;|\;f(x)\),即\(f(…
Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即可 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space…
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_d 给定N,K和A1...AN,B1...BN,选取若干个Ai使它们的或运算值小于等于K时,使得对应的ΣBi值最大,求最大值. 其实我不大理解为什么要这么弄. 一个数K,如果X小于它,那么K的二进制中第r位是1,X的第r位可以是0或1:但如果K的第r位是0,X的第r位一定是0. 我只能勉强这样想: 可以先选定一个或运算值的上限tmp,如果(Ai|tmp==tmp),那么根据或运算性质当…
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_c 我怀疑我是不是智障.... 本来一直的想法是能不能构造出答案,把N按奇偶分,偶数好办,但是奇数死活想不出,结果想暴力,显然三种循环是过不了的. 那就直接二重循环暴力,求第三数不就行了啊!!!!哇靠, 这里唯一要注意的是N可能很大,开成long long吧,反正刚开始我int没过,把所有变量都改成long long 就好了. #include<iostream> #include&…
C:即要使前一部分为白色后一部分为黑色,枚举分割点前缀和计算答案取min即可. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 200010 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getcha…