Atcoder Tenka1 Programmer Contest 2019 题解
题面真简洁 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 序列的合法方案,只有两种情况:
- 总和 $<x-1$
- 存在前缀和 $=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 题解的更多相关文章
- Atcoder Tenka1 Programmer Contest 2019题解
传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...
- 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求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...
随机推荐
- css radial-gradient()函数用法
radial:半径的:放射状的:射线:光线:径向 gradient:梯度,坡度:渐变 radial-gradient:径向渐变 radial-gradient()函数:用径向渐变创建函数.径向渐变由中 ...
- POJ - 3020 Antenna Placement(最小覆盖路径)
---恢复内容开始--- https://vjudge.net/problem/POJ-3020 题意 *--代表城市,o--代表空地 给城市安装无线网,一个无线网最多可以覆盖两座城市,问覆盖所有城市 ...
- artTemplate
1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html
- VMware Linux 下 Nginx 安装配置 - nginx.conf 配置 [负载两个 Tomcat] (三)
首先启动Nginx 1. 相关浏览 两个 Tomcat 配置: VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二) Nginx 安装配置启动: VMware Linu ...
- 编写 grunt 插件经验
第一步: 先生成插件模板: 利用命令生成, 首先通过github工具获取gruntplugin模板文件: 第二步: 了解plugin/tasks/taskName.js的registerMultiTa ...
- Linux - awk 文本处理工具二
awk 判断格式 awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 条件判断 括号代表if语句判断 "?" ...
- C++ 修饰符类型
C++ 修饰符类型 C++ 允许在 char.int 和 double 数据类型前放置修饰符.修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求. 下面列出了数据类型修饰符: signed u ...
- Shell命令行中特殊字符与其转义详解(去除特殊含义)
特殊符号及其转义 大家都知道在一个shell命令是由命令名和它的参数组成的, 比如 cat testfile, 其中cat是命令名, testfile是参数. shell将参数testfile传递给c ...
- Windows修改默认远程端口号3389
1.打开注册表:运行-regedit: 2.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\ ...
- centos6.5环境Redis下载及编译安装
centos6.5环境Redis下载及编译安装 1:官方站点: http://redis.io/download 下载最新版或者最新stable版 2:解压源码并进入目录 tar -zxvf redi ...