link

题面真简洁 qaq

C Stones

最终一定是连续一段 . 加上连续一段 # 。直接枚举断点记录前缀和统计即可。

 #include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++) using namespace std; const int N=2e5+;
int n,cnt0[N],cnt1[N],ans; char s[N]; int main(){
scanf("%d%s",&n,s+);
rep (i,,n) cnt0[i]+=s[i]=='#',cnt1[i]+=s[i]=='.';
rep (i,,n) cnt0[i]+=cnt0[i-],cnt1[i]+=cnt1[i-];
ans=n;
rep (i,,n) ans=min(ans,cnt0[i]+cnt1[n]-cnt1[i]);
printf("%d\n",ans);
return ;
}

D Three Colors

记 S 为总和,不妨设 $R>B,G$ ,那么有 $R\leq \frac S2$ 。考虑总方案减去 $R>\frac S2$ 的方案,后者用 f[i][j] 表示前 i 个数和为 j 的方案数,跑一遍 dp 即可。注意若存在 $R=B=\frac S2$ 这种情况需要去重。

 #include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++) using namespace std; const int N=,mod=;
int n,a[N],f[N][N*N],g[N][N*N],all,sum,res; inline void upd(int &x,int y){x+=y; x-=x>=mod?mod:;} int main(){
ios::sync_with_stdio();
cin>>n;
all=;
rep (i,,n) cin>>a[i],all=all*3ll%mod;
f[][]=;
rep (i,,n){
rep (j,,sum) if (f[i-][j]){
upd(f[i][j],f[i-][j]*2ll%mod);
upd(f[i][j+a[i]],f[i-][j]);
}
sum+=a[i];
}
rep (i,(sum+)>>,sum) upd(res,f[n][i]);
if (!(sum&)){
sum=;
g[][]=;
rep (i,,n){
rep (j,,sum) if (g[i-][j]){
upd(g[i][j],g[i-][j]);
upd(g[i][j+a[i]],g[i-][j]);
}
sum+=a[i];
}
upd(res,mod-g[n][sum/]);
}
upd(all,(mod-res)*3ll%mod);
cout<<all;
return ;
}

E Polynomial Divisors

【开启翻译模式】

首先提取系数的 $\gcd$ 的所有质因子。

然后对于一个质数 $p\leq n$ ,整系数多项式 $f(x)$ 若满足所有 $x$ 代入的值都被 $p$ 整除,当且仅当在 $\mod p$ 意义下, $f$ 含有因式 $x^p-x$ 。那么我们只需要对所有质数 $p$ ,做一次模意义下多项式除法,检验余式是否为 0 即可。

证明:

  • 充分性:根据费马小定理显然。
  • 必要性:可以从如下事实证明:在 $\mod p$ 意义下 $0,1,...,p-1$ 均为 $f(x)$ 的根,那么 $f(x)$ 含有因式 $x(x-1)(x-2)...(x-(p-1))$ ,而 $x(x-1)(x-2)...(x-(p-1))$ 在 $\mod p$ 意义下和 $x^p-x$ 等价(如果它们不一致,我们可以得到它们的差并得到 $\leq p-1$ 次的含有 $p$ 个根的多项式,矛盾)。
 #include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define Vi vector<int> using namespace std; const int N=1e4+;
int n,a[N],g,b[N],c[N]; Vi V; bool is_prime(int x){
for (int i=;i*i<=x;i++) if (x%i==) return ;
return ;
}
bool chk(int p){
if (a[]%p) return ;
rep (i,,n-) b[i]=a[i+]%p;
for (int i=n-;i>=p-;i--) (b[i-(p-)]+=b[i])%=p,b[i]=;
rep (i,,n-) if (b[i]%p) return ;
return ;
} int main(){
ios::sync_with_stdio();
cin>>n;
rep (i,,n) cin>>a[i],g=__gcd(g,a[i]);
g<?g=-g:; reverse(a,a+n+);
for (int i=;i*i<=g;i++)
if (g%i==){
V.push_back(i);
while (g%i==) g/=i;
}
if (g>) V.push_back(g);
rep (i,,n) if (is_prime(i)&&chk(i)) V.push_back(i);
sort(V.begin(),V.end());
rep (i,,(int)V.size()-) if (!i||V[i]!=V[i-]) cout<<V[i]<<'\n';
return ;
}

F Banned X

先不考虑 0 ,最后插入到 1, 2 中即可。

我们枚举 1, 2 构成的序列长度 n 。

考虑 1, 2 序列的合法方案,只有两种情况:

  1. 总和 $<x-1$
  2. 存在前缀和 $=x-1$

首先证明除了 $<x-1$ 的情况,若序列合法一定存在前缀和 $=x-1$ 。(这或许是个极其显然的命题,然而请原谅本人数学水平低下,若觉得显然可以直接跳过)

若序列和 $=x-1$ ,得证;

若序列和 $=x$ ,不合法,不予考虑;

若序列和 $>x$ :设数列 $sum_i$ 为序列前缀和,序列长度为 $N$ 。

若 $x=1$ ,有 $sum_0=0=x-1$ ,下面只考虑 $x>1$ 的情况。

考虑反证,假设不存在前缀和 $=x-1$ ,同时由于序列合法,可知也不存在前缀和 $=x$ 。那么有 $\forall \ i ,sum_i \neq x,sum_i\neq x-1$ ,即 $\forall\ i, sum_i<x-1 \ or \ sum_i>x$ 。由于前缀和具有单调递增性(在数值均 >0 的情况下),而 $sum_0=0,sum_N>x$ ,故 $\exists\ i\in [1,N], \ sum_{i-1}<x-1,sum_i>x$ ,也就是 $sum_i-sum_{i-1}>2$ ,和题中序列值域在 $[1,2]$ 矛盾。

故命题得证。

那么枚举和 $=x-1$ 的前缀长度。接下来考虑还有什么限制?

若序列 $a[1...k]$ 和为 $x-1$ 且 $k<n$ ,那么 $a[k+1]=2$ ,此时发现若 $a[1]=1$ ,那么存在子串 $a[2...k+1]$ 和为 $x-1$ 不合法,故 $a[1]=2$ 。所以以此类推,可以得到 $a[k+1...n]$ 均为 2 , $a[1...n-k]$ 同样均为 2 。

那么若 $n-k\leq k$ ,只需考虑长为 $k-(n-k)$ 的部分的方案数即可;若 $n-k>k$ ,此时发现唯一合法的情况为全部填 2 ,容易判断。

总时间复杂度 $\mathcal{O}(n^2)$ 。

 #include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define ll long long using namespace std; const int N=,mod=;
int n,x,f[N][N<<],fac[N],inv[N],ans; inline void upd(int &x,int y){x+=y; x-=x>=mod?mod:;} void init(int n){
fac[]=fac[]=inv[]=inv[]=;
rep (i,,n) fac[i]=(ll)fac[i-]*i%mod,inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
rep (i,,n) inv[i]=(ll)inv[i]*inv[i-]%mod;
}
int C(int n,int m){return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;} int main(){
ios::sync_with_stdio();
cin>>n>>x; init(n);
f[][]=;
rep (i,,n) rep (j,,x){
upd(f[i][j],f[i-][j-]);
if (j>) upd(f[i][j],f[i-][j-]);
}
rep (i,,n){
int res=;
rep (j,,x-) upd(res,f[i][j]);
rep (j,,i)
if (i-j<=j&&x--*(i-j)>=) upd(res,f[j-(i-j)][x--*(i-j)]);
else if (i-j>j&&j*==x-) upd(res,);
upd(ans,(ll)C(n,i)*res%mod);
}
printf("%d\n",ans);
return ;
}

Atcoder Tenka1 Programmer Contest 2019 题解的更多相关文章

  1. Atcoder Tenka1 Programmer Contest 2019题解

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

  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. 解决linux mysql命令 bash: mysql: command not found 的方法

    错误: root@DB-02 ~]# mysql -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这 ...

  2. 前端必须掌握的30个CSS选择器

    也许你已经学会了CSS的三个简单常用的选择器:#ID,.class,标签选择器,可是这些就足够了吗?随着CSS3的到来,作为前端开发者需要掌握下面三十个基本的选择器,这样才可以在平时开发中得心用手. ...

  3. 从零开始写一个武侠冒险游戏-0-开发框架Codea简介

    从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...

  4. HDU 1730 类NIM模型

    两者间的间距就是可取石子数,因为对于行内黑白相连的局面该子游戏已经结束了因为此时不管先手再怎么移都是必败,SG=0的终止态 /** @Date : 2017-10-14 21:46:21 * @Fil ...

  5. spring框架学习(四)AOP思想

    什么是AOP 为什么需要AOP 从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力.事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问 ...

  6. JS 简易控制台插件 [供 博客, 论坛 运行js用]

    今天厚着脸皮来推荐下鄙人写的一个小插件吧.看过我博客的应该都熟悉这个插件了,其实就是这货. 这东西是我去年写的,当时水平也不怎么样,不过好歹还是实现了简单功能.我先简单介绍下这东西什么用吧. 因为在 ...

  7. 20155306 2016-2017-2 《Java程序设计》第八周学习总结

    20155306 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 java.util.loggging包提供了日志功能相 ...

  8. 200行代码实现RPC框架

    之前因为项目需要,基于zookeeper和thrift协议实现了一个简单易用的RPC框架,核心代码不超过200行. zookeeper主要作用是服务发现,thrift协议作为通信传输协议, 基于com ...

  9. C - Segments POJ - 3304 (判断线段相交)

    题目链接:https://vjudge.net/contest/276358#problem/C 题目大意:给你n条线段,问你是否存在一条线段使得所有的线段在这条直线的投影至少具有一个交点? 具体思路 ...

  10. [转]OpenMP 入门指南

    简介 这门课作为 ECE 中少有的跟计算机科学相关的课,自然是必上不可.不过无论是 OpenMP 还是 CUDA,对于平时极少接触并行编程的我来说,都是十分吃力的,第一次作业的 OpenMP 编程已经 ...