日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 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倍數(shù),則兩個數(shù)同余200200200,按照模完后的余數(shù)分類單獨計算即可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個數(shù)中選某些數(shù)的和模200200200余數(shù)為jjjiii必選)的方案數(shù)

直接大力轉移,順便用維克托兒記錄下轉移路徑,方案數(shù)一旦等于222即代表有解

因為DPDPDP定義限制,兩個序列的最后一個一定是一樣的,這可能導致無法記錄下最后一位不一樣的方案

所以在原序列后面加一個000,這樣保證了兩個數(shù)列的最后一位一定會是一樣的

#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個數(shù)和為jjj的方案數(shù)量

發(fā)現(xiàn)狀態(tài)轉移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?是連續(xù)段轉移,用差分即可

接著線性即可掃出總和,然后枚舉美麗度,計算出味道的取值范圍,進而確定味道,自然而然就確定了歡迎度

#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=010110,S={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?,把iiiSSS中刪掉,否則加入其中

最后答案形態(tài)則是S=?S=\emptyS=?

不難發(fā)現(xiàn),每次最多會從SSS中刪去兩個數(shù),所以最后的答案為?tot2?\lceil\frac{tot}{2}\rceil?2tot??(tot=∣S∣tot=|S|tot=S)

接下來考慮統(tǒng)計所有情況串中相鄰兩個字符不同的數(shù)量

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次操作

我們本意是想上取整,但是在模意義下非常難搞

事實上,對于一個有奇數(shù)對相鄰字符不一樣的串,重復多次后,理想與實際操作之間是恒定的

舉個例子,101100,三對不一樣,花費222,實際算的是111,重復一遍101100101100,七對不一樣,花費444,實際算的是333……

歸納一下,也就是說對于奇數(shù)對的串答案總是少了111

加上這奇數(shù)對串的個數(shù)即為正確結果

不難發(fā)現(xiàn),奇數(shù)對串的個數(shù)恰恰為首尾字符不相等的個數(shù),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; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。