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求出这种情况的方案数,然后用总方案数减去就可以求出答案. 注意 ...
随机推荐
- python 玩具代码
脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python ...
- 前三章 man手册 查看文件
1 – 3章 1.1 man手册: 分1 - 9个区域,可以认为是一个一个小节 把man手册理解为一本书 第一节:可执行程序或shell命令 第二节:系统调用 第三节:库调用 第四节:特殊文件 第五节 ...
- raphael.js 给元素 hover 添加glow() 外发光
用raphael.js 给 svg画布里面添加个元素,嗯就圓好了,男人一般都喜欢圆形的东西,比如xx , xxx , 还有xxx $(document).ready(function() { var ...
- 基于canvas将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...
- 为什么今天的L4无人驾驶无法到达终局(转)
本文来自于公众号驭势未来,是驭势科技的微信公众平台,本博客收录的这篇文章版权作者吴甘沙,博客中仅对部分内容进行编辑. 作者:吴甘沙 原文链接:here 声明:文中的观点只代表版权作者的观点,本转载不涉 ...
- aps.net webform框架下页面服务器端控件和html控件用法
(1)select 下拉框 前端: <select name="gameserverlist" id="gameserverlist" runat=&qu ...
- 如何得到Slave应用relay-log的时间
官方社区版MySQL 5.7.19 基于Row+Position搭建的一主一从异步复制结构:Master->{Slave} ROLE HOSTNAME BASEDIR DATADIR IP PO ...
- 问题:经典类的对象明明没有__class__属性,却可以调用。
这个问题得深入python源码才能看. class a: pass aa =a() print dir(aa)#aa只有doc和module属性 print aa.__class__#__main__ ...
- lucene删除索引——(五)
增加在入门程序创建索引中,增删改用IndexWriter. 1.获取IndexWriter的代码 // public IndexWriter getIndexWriter() throws Excep ...
- 【CTF WEB】函数绕过
函数绕过 <?php show_source(__FILE__); $c = "<?php exit;?>"; @$c.=$_GET['c']; @$filena ...