Processing math: 100%

ARC081 D : Coloring Dominoes(400)

作成日:2017.08.24
最終更新日:2017.08.24

問題概要

問題本文

 2×Nのマス目に1×2(向きは任意)のドミノをN個重ならないように敷き詰めたものが与えられる。 辺で接しているものは異なる色となるようにドミノを3色で塗り分ける時の塗り方が何通りあるかをmod109+7で求めよ。
制約
1N52
|S1|=|S2|=N
S1,S2は英小文字または英大文字
Sij文字目は上からi番目、左からj番目のマスを表し、同じ文字のマスには同じドミノがある。

考え方

 左の列から順に色を塗っていくことを考える。 マス目は2行しかないので、ある列においては1つのドミノが占める(壱)か2つのドミノが占める(弐)かのいずれかである。 また色の塗り方は直前の列にのみ依存するから、一番左の列を除くと4通りだけ考えれば良い。
 すべての場合を列挙するなどすると以下のことが分かる。 一番左の列の塗り方は、壱の時は3通り、弐の時は6通りである。 直前の列が壱の時の塗り方は、壱の時も弐の時も2通りである。 直前の列が弐の時の塗り方は、壱の時は1通り、弐の時は直前の列と同じドミノなら1通りでそうでなければ3通りである。
 以上を順にmod109+7でかけ合わせていけば答えが求まる。

ソースコード

マクロ等はこちら

  1. const LL mod = 1e9 + 7;
  2. int N;
  3. char S1[55],S2[55];
  4. LL ans = 1;
  5.  
  6. int main(){
  7. scanf("%d" , &N);
  8. scanf(" %s" , S1);
  9. scanf(" %s" , S2);
  10. int pre = 0; //直前の列のドミノの状態を表す
  11. repp(i,0,N){
  12. if(S1[i] == S2[i]){
  13. if(pre == 0){
  14. (ans *= 3) %= mod;
  15. } else if(pre == 1){
  16. (ans *= 2) %= mod;
  17. }
  18. pre = 1;
  19. } else {
  20. if(pre == 0){
  21. (ans *= 6) %= mod;
  22. } else if(pre == 1){
  23. (ans *= 2) %= mod;
  24. } else {
  25. (ans *= 3) %= mod;
  26. }
  27. pre = 2;
  28. ++i;
  29. }
  30. }
  31. printf("%lld\n" , ans);
  32. return 0;
  33. }

解法まとめ

 左の列から色を塗っていくことを考え、考察で述べた各列の塗り方をmod109+7でかけ合わせていく。(10-30行)

ARC081の他の問題 C E F

自己紹介

プログラミングとか合成音声とか
詳しくはこちら
twitter

プライバシーポリシー

個人情報利用についてはこちら

最終更新日:2023.03.05

お問い合わせ

このページに関するお問い合わせはこちら

競技プログラミングMENU

問題を解くまでの道のり

その他

全体MENU

寄付モドキ

0冂から10000冂まで
詳しくはこちら