文章目录

  • 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}^2Cri​2​

#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余数为jjj(iii必选)的方案数

直接大力转移,顺便用维克托儿记录下转移路径,方案数一旦等于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,j​→dpi+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={i∣Ti​​=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​=len−1​​α(l−1)α(r)​
α(i):\alpha(i):α(i):如果Ti≠Ti+1T_i≠T_{i+1}Ti​​=Ti+1​,把iii从SSS中删掉,否则加入其中

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

不难发现,每次最多会从SSS中删去两个数,所以最后的答案为⌈tot2⌉\lceil\frac{tot}{2}\rceil⌈2tot​⌉(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=0len−1​f(i,i+1)+(k−1)×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​=⎩⎪⎨⎪⎧​21​10​​​(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​,Tlen−1​)

所以最后的答案是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=0len−1​f(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;
}

KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解相关推荐

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

    Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举 ...

  2. KYOCERA Programming Contest 2021 (AtCoder Beginner Contest 200) A~E 题解

    ABC200/KYOCERA2021 A~E [A - Century](https://atcoder.jp/contests/abc200/tasks/abc200_a) 题目大意 输入格式 输出 ...

  3. Atcoder TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) C - Final Day

    题目链接:C - Final Day (atcoder.jp) Problem Statement N students are taking a 4-day exam. There is a 300 ...

  4. NEC Programming Contest 2021(AtCoder Beginner Contest 229) B - Hard Calculation

    题目链接:B - Hard Calculation (atcoder.jp) Problem Statement You are given positive integers A and B. Le ...

  5. Atcoder TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) B - Takahashi‘s Secret

    题目链接:B - Takahashi's Secret (atcoder.jp) Problem Statement Takahashi has N friends. They have nickna ...

  6. Mynavi Programming Contest 2021 (AtCoder Beginner Contest 201) A~E 题解

    ABC201/Mynavi2021 A~E [A - Tiny Arithmetic Sequence](https://atcoder.jp/contests/abc201/tasks/abc201 ...

  7. NEC Programming Contest 2021 (AtCoder Beginner Contest 229)

    终于开始补提了 重点 : C, E的倒着算, F的染色,G的相邻的转换: B - Hard Calculation #include <iostream> #include <alg ...

  8. TOYOTA SYSTEMS Programming Contest 2021(AtCoder Beginner Contest 228) ABCD

    A 题意: 有一个开关,每天s点开,t点关(可能在第2天或第n天),判断x点时开着还是关着. 思路: 按照是否需要隔夜分个类. #include<bits/stdc++.h> using ...

  9. Caddi Programming Contest 2021(AtCoder Beginner Contest 193) F.Zebraness

    题目链接 Problem Statement We have a grid with N horizontal rows and N vertical columns. Let (i,j) denot ...

  10. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

    文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...

最新文章

  1. mongodb内存限制初探
  2. 合并石子 四边形不等式优化
  3. 在linux中运行多文件,在Linux中打开了太多文件(Too many open files)的三种解决方法...
  4. go 发送http请求; Golang 解析JSON 篇
  5. leetcode最小面积_LeetCode—— 939. 最小面积矩形(JavaScript)
  6. Android端发送字符到Wed端,android应用端向web端获取字符串。
  7. 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用
  8. Web3.0中国峰会将于7月在成都召开
  9. 超声波测距(含报警功能)
  10. 13.es slop参数实现近似匹配以及原理剖析和相关实验
  11. Excel学习笔记:P27-我的表格有重复内容该怎么办?简单三招让它们现出原形
  12. 搜狗老域名作用之快速大量搜狗收录
  13. 在x86和arm混合部署架构下排查TiKV节点内存占用极高的问题
  14. 【RISC-V】SiFive Unmatched开发板开发手记
  15. Android Snackbar基本使用
  16. MySQL 数据库重启
  17. Java版SLG游戏 竜退治2
  18. MySQL数据库,数据的约束
  19. MySQL实现自增的序列(Sequence)
  20. 别再研究秒杀茅台了,小伙用爬虫捡漏买奔驰!

热门文章

  1. 当初互联网大佬给的几块钱“羊毛”,现在又要我们加倍还回去!
  2. 超级智能玩具《小小机器人》首发|全新50种玩法,创造力之源
  3. 这一次,用数据解读玩家行为,用实力拿下预测大奖!
  4. SparkSQL DataFrame进阶篇
  5. 浮点数赋值给整数_初学者专题:变量和赋值
  6. 马斯克脑机接口_马斯克的脑机接口,让我倍感担忧
  7. linux cpu softirq,linux softirq机制
  8. oracle中的的instr,Oracle中instr函数使用方法
  9. dma接收双缓存 stm32_「STM32学习笔记」USART 新特性
  10. toast弹窗_Android 开发(一):Toast弹窗与获取控件的值