KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解

文章目录

  • A - Century
  • B - 200th ABC-200
  • C - Ringo's Favorite Numbers 2
  • D - Happy Birthday! 2
  • E - Patisserie ABC 2
  • F - Minflip Summation

KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)

A - Century

简单的除以200200200向上取整

B - 200th ABC-200

翻译成程序,whilewhilewhile模拟即可

C - Ringo’s Favorite Numbers 2

差为200200200倍数,则两个数同余200200200,按照模完后的余数分类单独计算即可Cri2C_{r_i}^2Cri2

#include <cstdio>
#define maxn 200005
#define int long long
int n;
int A[maxn], r[205];signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &A[i] ), r[A[i] % 200] ++;int ans = 0;for( int i = 0;i < 200;i ++ )ans += ( r[i] * ( r[i] - 1 ) / 2 );printf( "%lld\n", ans );return 0;
}

D - Happy Birthday! 2

dpi,j:dp_{i,j}:dpi,j:iii个数中选某些数的和模200200200余数为jjjiii必选)的方案数

直接大力转移,顺便用维克托儿记录下转移路径,方案数一旦等于222即代表有解

因为DPDPDP定义限制,两个序列的最后一个一定是一样的,这可能导致无法记录下最后一位不一样的方案

所以在原序列后面加一个000,这样保证了两个数列的最后一位一定会是一样的

#include <cstdio>
#include <vector>
using namespace std;
#define int long long
#define maxn 205
vector < pair < int, int > > G[maxn][maxn];
int n;
int A[maxn], ans1[maxn], ans2[maxn];
int f[maxn][maxn];void print( int *ans, int &cnt, int p, int r ) {if( ! G[p][r].size() ) return;ans[++ cnt] = p;print( ans, cnt, G[p][r][0].first, G[p][r][0].second );
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &A[i] );A[++ n] = 0;f[0][0] = 1;int pos, r; bool flag = 1;for( int i = 1;i <= n && flag;i ++ )for( int j = 0;j < i && flag;j ++ )for( int k = 0;k <= 200 && flag;k ++ )if( f[j][k] ) {f[i][( k + A[i] ) % 200] += f[j][k];G[i][( k + A[i] ) % 200].push_back( make_pair( j, k ) );if( f[i][( k + A[i] ) % 200] == 2 ) {pos = i, r = ( k + A[i] ) % 200;flag = 0;break;}}if( ! flag ) {printf( "Yes\n" );int cnt1 = 0, cnt2 = 0, t = 0;ans1[++ cnt1] = ans2[++ cnt2] = pos;print( ans1, cnt1, G[pos][r][0].first, G[pos][r][0].second );print( ans2, cnt2, G[pos][r][1].first, G[pos][r][1].second );if( pos == n ) t = 1;printf( "%lld", cnt1 - t );for( int i = cnt1;i > t;i -- )printf( " %lld", ans1[i] );printf( "\n%lld", cnt2 - t );for( int i = cnt2;i > t;i -- )printf( " %lld", ans2[i] );}elseprintf( "No\n" );return 0;
}

E - Patisserie ABC 2

dpi,jdp_{i,j}dpi,j表示选到第iii个数和为jjj的方案数量

发现状态转移dpi,j→dpi+1,j+1,dpi+1,j+2...dpi+1,j+ndp_{i,j}\rightarrow dp_{i+1,j+1},dp_{i+1,j+2}...dp_{i+1,j+n}dpi,jdpi+1,j+1,dpi+1,j+2...dpi+1,j+n是连续段转移,用差分即可

接着线性即可扫出总和,然后枚举美丽度,计算出味道的取值范围,进而确定味道,自然而然就确定了欢迎度

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
int dp[4][3000005];
int n, k;signed main() {scanf( "%lld %lld", &n, &k );dp[0][0] = 1;for( int i = 0;i < 3;i ++ ) {for( int j = 0;j <= i * n;j ++ ) {dp[i + 1][j + 1] += dp[i][j];dp[i + 1][j + n + 1] -= dp[i][j];}for( int j = 1;j <= ( i + 1 ) * n;j ++ )dp[i + 1][j] += dp[i + 1][j - 1];}int sum;for( int i = 3;i <= 3 * n;i ++ )if( dp[3][i] >= k ) {sum = i;break;}elsek -= dp[3][i];for( int beauty = 1;beauty <= n;beauty ++ ) {int minn = max( 1ll, sum - beauty - n );int maxx = min( n, sum - beauty - 1 );if( minn > maxx ) continue;if( k > maxx - minn + 1 ) k -= ( maxx - minn + 1 );else {int taste = minn + k - 1;return ! printf( "%lld %lld %lld\n", beauty, taste, sum - beauty - taste );}}return 0;
}

F - Minflip Summation

对于每种可能串TTT,设S={i∣Ti≠Ti+1},i∈[0,len)S=\{i|T_i≠T_{i+1}\},i∈[0,len)S={iTi=Ti+1},i[0,len),举个栗子T=010110S={0,1,2,4}

改写每次对一段l,r进行操作
{l≠1α(l−1)r≠len−1α(r)\begin{cases} l≠1&&\alpha(l-1)\\ r≠len-1&&\alpha(r)\\ \end{cases}\\ {l=1r=len1α(l1)α(r)
α(i):\alpha(i):α(i):如果Ti≠Ti+1T_i≠T_{i+1}Ti=Ti+1,把iiiSSS中删掉,否则加入其中

最后答案形态则是S=∅S=\emptyS=

不难发现,每次最多会从SSS中删去两个数,所以最后的答案为⌈tot2⌉\lceil\frac{tot}{2}\rceil2tot(tot=∣S∣tot=|S|tot=S)

接下来考虑统计所有情况串中相邻两个字符不同的数量

cnt=2kq×(k×∑i=0len−1f(i,i+1)+(k−1)×flen,0)cnt=2^{kq}\times (k\times \sum_{i=0}^{len-1}f(i,i+1)+(k-1)\times f_{len,0})cnt=2kq×(k×i=0len1f(i,i+1)+(k1)×flen,0)
fi,j={12(Ti=?)∣(Tj=?)1(Ti≠Tj)0(Ti=Tj)f_{i,j}=\begin{cases} \frac{1}{2}&&&(T_i=?)|(T_{j}=?)\\ 1&&&(T_i≠T_j)\\ 0&&&(T_i=T_j) \end{cases} fi,j=2110(Ti=?)(Tj=?)(Ti=Tj)(Ti=Tj)

简单讨论一下

  • Ti=Tj=0/1T_i=T_j=0/1Ti=Tj=0/1,那么对于2kq2^{kq}2kq种情况的字符串iii都不可能被算进SSS,贡献000
  • Ti=0/1,Tj=1/0,Ti≠TjT_i=0/1,T_j=1/0,T_i≠T_jTi=0/1,Tj=1/0,Ti=Tj,同理对于2kq2^{kq}2kq种情况的字符串iii都会被算进SSS,贡献111
  • 只有一个是???,那么只有12\frac{1}{2}21的概率贡献111,与另一个确定的字符不一样
  • 两个都是???,一共有444种情况,两种相同(都是111,都是000),概率同样是12\frac{1}{2}21

重复KKK次原串,那么除了首尾少一次,其余都要×k\times k×k

但是这里仍然存在有一点小问题。

10100有三对相邻字符不一样,101001有四对相邻字符不一样,但是都需要花费222次操作

我们本意是想上取整,但是在模意义下非常难搞

事实上,对于一个有奇数对相邻字符不一样的串,重复多次后,理想与实际操作之间是恒定的

举个例子,101100,三对不一样,花费222,实际算的是111,重复一遍101100101100,七对不一样,花费444,实际算的是333……

归纳一下,也就是说对于奇数对的串答案总是少了111

加上这奇数对串的个数即为正确结果

不难发现,奇数对串的个数恰恰为首尾字符不相等的个数,2kq×f(T0,Tlen−1)2^{kq}\times f(T_0,T_{len-1})2kq×f(T0,Tlen1)

所以最后的答案是cnt=2kq×k×∑i=0len−1f(i,(i+1)%len))cnt=2^{kq}\times k\times \sum_{i=0}^{len-1}f(i,(i+1)\%len))cnt=2kq×k×i=0len1f(i,(i+1)%len))

#include <cstdio>
#include <cstring>
#define int long long
#define mod 1000000007
#define maxn 100005
char s[maxn];
int k, inv, ans;int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}int f( char x, char y ) {if( x == '?' || y == '?' ) return inv;else if( x != y ) return 1;else return 0;
}signed main() {scanf( "%s %lld", s, &k );int len = strlen( s );if( len * k == 1 ) return ! printf( "0\n" );int tot = 0;inv = qkpow( 2, mod - 2 );for( int i = 0;i < len;i ++ )tot += ( s[i] == '?' );int t = qkpow( 2, k * tot ) * k % mod;for( int i = 0;i < len;i ++ )ans = ( ans + t * f( s[i], s[( i + 1 ) % len] ) % mod ) % mod;ans = ans * inv % mod;printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”熟悉.NET Framework的人知道&#xff0c;我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目&#xff0c;也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我…

Little Boxes UVALive - 8209

Little Boxes UVALive - 8209 题意&#xff1a; 给你四个数&#xff0c;输出四个数之和&#xff0c;四个数小于等于262之内 题解&#xff1a; 这。。。这。。水题 unsigned int 0&#xff5e;4294967295 (10位数&#xff0c;4e9) int -2147483648&#xff5e;2147483647 (…

2.15模拟总结

前言 day11 期望&#xff1a;406030130 实际&#xff1a;4003070 rnk16 挂大分了。。 T2树边不加双向&#xff1a;60->0。 这什么伞兵bug啊&#xff01; 整体状态也不太好&#xff0c;T2死磕无果。 T1看出正解结果写不出来拉插&#xff0c;乐。 题目解析 T1 网格序列&am…

Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

文章目录A - Tiny Arithmetic SequenceB - Do you know the second highest mountain?C - Secret NumberD - Game in Momotetsu WorldE - Xor DistancesF - Insertion SortMynavi Programming Contest 2021&#xff08;AtCoder Beginner Contest 201&#xff09;A - Tiny Arit…

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

Rabbits UVALive - 8211

Rabbits UVALive - 8211 题意&#xff1a; n个兔子的位置&#xff0c;兔子每次可以跳到两个兔子之间&#xff0c;问最多可以跳多少下&#xff1f; 题解&#xff1a; 求出所有相邻两数的间隔&#xff0c;然后减去最小间隔就是答案 代码&#xff1a; #include <bits/std…

2.16模拟总结

前言 期望&#xff1a;100700170 实际&#xff1a;400040 rnk14 分全部挂没了&#xff0c;太行了。 T1不开longlong见祖宗&#xff0c;而且KH说的那个也有道理&#xff0c;带权之后树的重心可以不只有两个&#xff0c;所以最后还应该倍增的跳。&#xff08;然而这个地方题解似…

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举判断符合要求的求最小值即可 C - Unexpressed O(n)O(\sqrt{n})O(n​)枚举aaa&#xff0c;暴力翻倍&#xff08;最小的222最多乘323232次就会超过nnn的上…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…

YBTOJBZOJ:大根堆(启发式合并)

解析 如果到了链上&#xff0c;本题就是求LIS。 考虑LIS的常见队列做法&#xff0c;其本质就是维护长度为 xxx 的序列的结尾的最小值 qxq_xqx​。 那么在本题尝试如法炮制&#xff0c;对于每个节点&#xff0c;都开一个队列&#xff0c;qxq_xqx​ 表示子树内选了 xxx 个节点后…

Tree UVALive - 8212

Tree UVALive - 8212 题意&#xff1a; 有n个点&#xff0c;k个颜色&#xff0c;每个点都要被染色&#xff0c;相同颜色之间的边算是被该颜色覆盖&#xff0c;问有多少边被所有颜色覆盖 题解&#xff1a; 题目给的是无根树&#xff0c;我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章&#xff08;.NET Core开源行动&#xff1a;一键创建Excel Add-in&#xff09; 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库&#xff0c;你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…

NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

文章目录A - 2nd Greatest DistanceB - RGB MatchingC - Odd Even SortD - 1 or 2E - Directed TreeF - Logical Operations on TreeNOMURA Programming Contest 2021(AtCoder Regular Contest 121)A - 2nd Greatest Distance 大模拟讨论yyds 将点按x,yx,yx,y分别排序 xxx贡献…

F - Heron and His Triangle UVALive - 8206

F - Heron and His Triangle UVALive - 8206 题意&#xff1a; 给你应该n&#xff0c;然后求一个最小的t&#xff0c;问长度为t-1&#xff0c;t&#xff0c;t1所组成的三角形的面积为整数,t>n 题解&#xff1a; 这题我一开始被题目的-1给迷惑了&#xff0c;以为筛出所有…

YBTOJ:最短时间(长链剖分、线段树)

解析 不难得到最优策略&#xff1a;先尽可能的快的送死直到路径畅通无组&#xff0c;然后一口气冲到t点。 现在的难点就在于如何尽可能的快的送掉特定的次数。 不难发现&#xff0c;花费时间关于死亡次数的函数必然是一个下凸包。 设 fx,if_{x,i}fx,i​ 表示子树内距离 xxx 不…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

【学习笔记】左偏树的可持久化(【模板】k短路 / [SDOI2010]魔法猪学院)

文章目录descriptionsolutioncode【模板】k短路 / [SDOI2010]魔法猪学院description iPig 在假期来到了传说中的魔法猪学院&#xff0c;开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后&#xff0c;iPig 对猪世界的世界本原有了很多的了解&#xff1…

Infinite Fraction Path UVALive - 8207

Infinite Fraction Path UVALive - 8207 题意&#xff1a; 给你n个数&#xff0c;每个数在0到9之间&#xff0c;每个数的下标一次是0~n-1&#xff0c;然后他所能走到的数为(i^21)%n,i为他本身的下标&#xff0c;然后让你求走n步&#xff0c;每一步的数相连&#xff0c;形成的…

YBTOJ洛谷P4869:出现位置(线性基)

解析 关键结论&#xff1a; 若 nnn 个数组成的线性基大小为 SSS&#xff0c;则其子集异或组成的结果有 2S2^S2S 种&#xff0c;且每种结果都有 2n−S2^{n-S}2n−S 种方案。 证明&#xff1a;考虑 n−Sn-Sn−S 个没有加入线性基的元素的任意一个子集&#xff0c;其异或和为 xxx…