【競プロ精進ログ】ABC178-C

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。

これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC178-C「Ubiquity」です。

ポイント

包含と排除の原理を利用する問題でした。少し頭を悩ませるのは,集合の設定です。「0が少なくとも1つは入っている」というような条件を考える場合は,「少なくとも」という部分に注目して余事象を考えるのが定番です。求める答えは,以下の図で色を塗っている部分になります。

包含と排除の原理を「0がない」「9がない」という余事象に対して適用する

実装中では演算ごとに$10^9+7$で割った余りを考えるようにしましょう。modの世界で考えるというやつです。注意するべきは,最後の出力が負になってしまう場合が考えられますので,その場合はしっかりと正に戻してあげる必要があります。

おさえるべき内容

 包含と排除の原理と余事象

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;
typedef long long ll;

ll N;
ll MOD = 1000000007;
ll a = 10;
ll b = 9;
ll c = 8;

int main(){
  cin >> N;

  rep(i, N-1){
    a = (a * 10) % MOD;
    b = (b * 9) % MOD;
    c = (c * 8) % MOD;
  }

  ll ac = (a + c) % MOD;
  ll ans = (ac - 2*b) % MOD;

  if (ans < 0) ans += MOD;
  cout << ans << endl;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる