Atcoder Tenka1 Programmer Contest 2019题解
\(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(res,sum[i][1]+sum[n][0]-sum[i][0]);
printf("%d\n",res);
return 0;
}
\(D\ Three\ Colors\)
首先根据容斥原理,用三种颜色染\(n\)个物品,且每种颜色都有的方案数是\(3^n-3\times 2^n+3\)
然后我们考虑怎么减去不合法的方案数。不合法的方案一定有一份的和大于等于总和的\({1\over 2}\),我们设\(f_{i,j}\)表示考虑前\(i\)个数,选的个数总和为\(j\),且剩下不选的数分为\(0/1\)的方案数,\(g_{i,j}\)表示剩下不选的数全都设为\(0\)的方案数,那么不合法的染色方案就是\(\sum (f_{n,i}-2\times g_{n,i})\times 3\)。直接转移就是
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=305,P=998244353;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
int f[2][N*N],g[2][N*N],a[N],n,res,t,sum;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
f[0][0]=1,g[0][0]=2,t=0;
fp(i,1,n){
scanf("%d",&a[i]);
memset(f[t^1],0,sizeof(f[t^1]));
memset(g[t^1],0,sizeof(g[t^1]));
fp(j,0,sum)if(f[t][j]||g[t][j]){
upd(f[t^1][j],mul(2,f[t][j]));
upd(g[t^1][j],g[t][j]);
upd(f[t^1][j+a[i]],f[t][j]);
upd(g[t^1][j+a[i]],g[t][j]);
}
sum+=a[i],t^=1;
}
fp(i,(sum+1)>>1,sum-1)res=add(res,dec(f[t][i],g[t][i]));
res=mul(res,3),res=P-res;
res=add(res,ksm(3,n)),res=dec(res,mul(3,ksm(2,n))),res=add(res,3);
printf("%d\n",res);
return 0;
}
\(E\ Polynomial\ Divisors\)
首先先对所有系数的\(\gcd\)分解质因子,那么这些质因子显然可以
对于剩下的,若\(p\)是一个可行的答案,当且仅当\(F(x)\equiv x^p-x\pmod{p}\)
证明:因为\(p\)是一个可行的答案,所以当\(x=0,1,2,...,p-1\)时,\(F(x)\)恒为\(0\),所以\(F(x)\equiv 0\pmod{p}\)的根为\(0,1,...,p-1\),根据费马小定理,\(x^p-x\equiv 0\pmod{p}\)的根也是这些。因为\(Z_p\)是唯一分解整环,所以必有\(F(x)\equiv x^p-x\pmod{p}\)
那么我们只要对于所有\(\leq n\)的质数检验一下就好了。简单来说就是计算\(F(n)\bmod (x^p+x)\)是否为\(0\)。直接暴力取模就可以了
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e5+5;
bitset<N>vis;int p[N],A[N],st[N],top,n,m,g;
void init(int n=N-5){
fp(i,2,n){
if(!vis[i])p[++m]=i;
for(R int j=1;j<=m&&i*p[j]<=n;++j){
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
void solve(int x){
for(R int i=1;p[i]*p[i]<=x;++i)if(x%p[i]==0){
st[++top]=p[i];
while(x%p[i]==0)x/=p[i];
}
if(x!=1)st[++top]=x;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),init();
fd(i,n,0)A[i]=read(),g=__gcd(g,A[i]);
solve(abs(g));
for(R int i=1;p[i]<=n;++i)if(A[0]%p[i]==0){
bool flag=1;
fp(j,1,p[i]-1){
int res=0;
for(R int k=j;k<=n;k+=p[i]-1)(res+=A[k])%=p[i];
if(res){flag=0;break;}
}
if(flag)st[++top]=p[i];
}
sort(st+1,st+1+top),top=unique(st+1,st+1+top)-st-1;
fp(i,1,top)printf("%d\n",st[i]);
return 0;
}
\(F\ Banned\ X\)
首先我们先计算出选\(i\)个数,全为\(1/2\),且没有连续子串和为\(x\)的方案数。然后对于每一个\(i\),用组合数计算出插入\(0\)的方案就行了
然后我们枚举选的\(i\)个数的和\(s\),记方案数为\(f_{i,s}\),这可以\(O(n^2)\)直接用背包预处理出来。如果\(s<x\),那么显然选的时候不会有问题,直接加上\(f_{i,s}\)就好了
如果\(s\geq x\),那么一定存在一个位置\(k\),使得从第\(1\)个位置到第\(k\)个位置的和是\(x-1\)(因为我们选的树数最大只能是\(2\)),那么第\(k+1\)个数肯定只能选\(2\),同理第\(1\)个数也只能选\(2\)。于是此时整个数列的形式一定是
前面\(a\)个\(2\),后面\(a\)个\(2\),中间随意。如果\(2a<x-1\),那么中间那堆的和肯定是\(x-1-2a\),否则的话,只有当\(x\)为奇数且所有数都为\(2\)时,才有贡献
//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=3005,P=998244353;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int f[N][N<<1],c[N],inv[N],x,n,res;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&x),res=1;
inv[0]=inv[1]=1;fp(i,2,n)inv[i]=mul(P-P/i,inv[P%i]);
c[0]=1;fp(i,1,n)c[i]=1ll*c[i-1]*inv[i]%P*(n-i+1)%P;
f[0][0]=1;fp(i,0,n-1)fp(j,0,i<<1)upd(f[i+1][j+2],f[i][j]),upd(f[i+1][j+1],f[i][j]);
fp(i,1,n){
int s=0;
fp(j,0,x-1)upd(s,f[i][j]);
for(R int j=x+1;j<=(i<<1);j+=2)if(j>=i){
int p=i-(j-x+1),q=x-1-(j-x+1);
if(j>=x*2)upd(s,j==(i<<1)?x&1:0);
else upd(s,p>=0&&q>=0?f[p][q]:0);
}
upd(res,mul(s,c[i]));
}
printf("%d\n",res);
return 0;
}
Atcoder Tenka1 Programmer Contest 2019题解的更多相关文章
- Atcoder Tenka1 Programmer Contest 2019 题解
link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...
- 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 D Three Colors
题意: 有\(n\)个石头,每个石头有权值,可以给它们染'R', 'G', 'B'三种颜色,如下定义一种染色方案为合法方案: 所有石头都染上了一种颜色 令\(R, G, B\)为染了'R', 染了'G ...
- 【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 ...
- Tenka1 Programmer Contest 2019 D - Three Colors
Three Colors 思路:dp 设sum为所有边的总和 不能组成三角形的情况:某条边长度>=ceil(sum/2),可以用dp求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...
随机推荐
- jQuery控制TR显示隐藏
参考链接:http://www.jb51.net/article/51221.htm 通过jQuery的hide和show方法即可.
- vue2.0 tab切换几种方式
第一种 比较灵活简单的方式(切换改变部分的内容在组件中比较方便操作) <template> <div id="app"> <ul> <li ...
- PAT 1084 外观数列(20)(代码+思路+推荐测试用例)
1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...
- Mockplus教程:分分钟搞定APP首页原型设计
Mockplus是一款快速原型设计工具,支持包括APP原型在内的多种原型与线框图设计.除了快速,Mockplus广受欢迎更因为它极低的上手门槛.今天小编就为大家展示如何用Mockplus在3分钟内完成 ...
- C++11新特性——The C++ standard library, 2nd Edition 笔记(一)
前言 这是我阅读<The C++ standard library, 2nd Edition>所做读书笔记的第一篇.这个系列基本上会以一章一篇的节奏来写,少数以C++03为主的章节会和其它 ...
- hdu-1060(数学问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1061 思路:结论:a=10^(N*lg(N) - [lg(N^N)]); 证明:如果一直a是结果,则a ...
- [转]一个CMake编译问题的解决过程
问题的提出 公司的一个power-pc平台的产品,有个协议进行了修改,过程中出现了比较奇怪的情况.直接将修改后的动态库下载到设备上(原始设备是有文件系统和其他的依赖文件的,相当于部分更新应用),设备和 ...
- flask_模板
由于python中生成html比较繁琐,所以flask自动为你配置好jinjia2模板.下面我们开始学习模板应用吧~ 1.编写microblog模块 注:(1)这里为了渲染模板,我们从Flask导入了 ...
- CentOS7+Nginx+多个Tomcat配置
转载自:https://blog.csdn.net/name_chc/article/details/73332272:亲测可用,加了一些注释: 配置多个tomcat转发 另附上tomcat启动慢的解 ...
- modelsim编译altera的库
http://www.cnblogs.com/LJWJL/p/3515586.html 在modelsim的安装目录下,把配置文件modelsim.ini的只读属性去掉,然后在modelsim中运行T ...