전공/알고리즘

백준 20500 (Ezreal 여눈부터 가네 ㅈㅈ)

xkdlaldfjtnl 2021. 11. 16. 13:19

https://www.acmicpc.net/problem/20500

 

20500번: Ezreal 여눈부터 가네 ㅈㅈ

문제의 답을 $1\,000\,000\,007$로 나눈 나머지를 출력한다.

www.acmicpc.net

1과 5로만 이루어진 수 중에서 15로 나누어 떨어지는 수가 몇 개있는지 세보자

1자리

1
5

X

2자리

15 O
55
11
51

1가지

이렇게 하다가 알 수 있는 간단한 사실
15 = 3*5

따라서 15의 배수이려면 k*(3*5) 이어야 하고, 5로 나누어 떨어져야 15로 나누어 떨어진다.

그러므로 1의 자리 수가 1이라면 불가능 끝에는 5만 올 수 있다.


여기서부터 조금 막혔다.

근데 10^N은 15로 나누었을때 나머지가 10이며
5*10^N은 15로 나누었을때 나머지가 5였다.

9876을 k로 나눈 나머지는

(a+b+c+d)%k = (a%k + b%k + c%k + d%k)%k 이므로

나머지가 0,5,10인 갯수를 저장해두고 dp식을 짜면 된다.

#include <bits/stdc++.h>

using namespace std;
#define TEST int tt; cin >> tt; while (tt--)
#define all(v) (v).begin(), (v).end()
#define loop(e, v) for (auto& (e) : (v))
#define mem(v, e) memset((v), (e), sizeof(v))
#define _unique(v) (v).erase(unique((v).begin(),(v).end()),(v).end())
#define pii pair<int, int>
#define pll pair<ll, ll>
#define tii tuple<int, int, int>
#define tll tuple<ll, ll, ll>
#define xx first
#define yy second
#define ll long long
#define ld long double
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(0);
const int MAX = 1005;
const int INF = 1e9 + 1;
const ll LINF = 1e18;
const ll MOD = 1e9 + 7;

int dp[2000][3];


int main() {
    FASTIO
    int N;
    cin >> N;
    dp[2][0] = 1;
    dp[2][2] = 1;
    for(int i=3; i<=N; i++){
        dp[i][0] = (dp[i-1][1]+dp[i-1][2])%MOD;
        dp[i][1] = (dp[i-1][0] + dp[i-1][1])%MOD;
        dp[i][2] = (dp[i-1][0] + dp[i-1][2])%MOD;
    }
    cout << dp[N][0];
}