传送门

\(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题解的更多相关文章

  1. Atcoder Tenka1 Programmer Contest 2019 题解

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

  2. Atcoder Tenka1 Programmer Contest 2019

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

  3. Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors

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

  4. Atcoder Tenka1 Programmer Contest 2019 D Three Colors

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

  5. 【AtCoder】Tenka1 Programmer Contest 2019

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

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

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

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

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

  8. Tenka1 Programmer Contest 2019

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

  9. Tenka1 Programmer Contest 2019 D - Three Colors

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

随机推荐

  1. No handlers could be found for logger “apscheduler.executors.default”?

    Call logging.basicConfig() before instantiating the scheduler. That lets you see what the real probl ...

  2. 轻松学SQL Server数据库

    轻松学SQL Server数据库pdf   下载地址:网盘下载 目录:  第1章 数据库与SQL Server 2008 11.1 数据库基础 21.1.1 数据库的概念 21.1.2 数据库模型 2 ...

  3. 任务取消TASK

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. sql中 in 、not in 、exists、not exists 用法和差别

    % 的一类. NOTIN:通过 NOTIN 关键字引入的子查询也返回一列零值或更多值. 以下查询查找没有出版过商业书籍的出版商的名称. SELECT pub_name FROM publishers ...

  5. myeclipse svn 插件去除已经保存的密码方法

    myeclipse svn 插件去除已经保存的密码方法   删除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn. ...

  6. EPLAN 软件平台中的词“点“大全

    1. 中断点(Interruption Point):     在原理图绘制时,如果当前绘图区域的空间不足,需要转到其它页面继续绘制,而这两页之间存在连续的“信息流“时,可以使用“中断点“来传递这种“ ...

  7. 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...

  8. 2018.09.02 bzoj1025: [SCOI2009]游戏(计数dp+线筛预处理)

    传送门 要将所有置换变成一个轮换,显然轮换的周期是所有置换长度的最小公倍数. 于是我们只需要求长度不超过n,且长度最小公倍数为t的不同置换数. 而我们知道,lcm只跟所有素数的最高位有关. 因此lcm ...

  9. phalApi数据库操作

    在很多时候,我们会遇到数据库表里面的某个值需要+1操作,我们不能简单地在update的时候写入array('key' => 'key+1'),因为在解析sql的时候,key+1 会带上引号作为一 ...

  10. 26. The Greenhouse Effect and Its Consequences 温室效应及其后果

    26. The Greenhouse Effect and Its Consequences 温室效应及其后果 ①The greenhouse effect causes trouble by rai ...