https://www.acmicpc.net/problem/30625
30625번: 댄스타임
첫째 줄에 호영이가 사인 앨범을 받을 수 있는 경우의 수를 소수 $1\,000\,000\,007$로 나눈 나머지를 출력하라.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
long long n,m;
long long deno = 1'000'000'007; // 분모
vector<long long> v;
long long dp[100'005];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(long long i = 0 ; i < n ; i++ ){
long long a,b;
cin >> a >> b;
v.push_back(b);
}
long long cnt = 0 ;
if(v[0]==0) cnt = 1;
else cnt = m-1;
dp[0] = m;
for(long long i = 1 ; i<n;i++){;
if(v[i]==1){
dp[i] = dp[i-1]*(m-1);
dp[i] += cnt;
cnt =cnt*(m-1);
}
else{
dp[i] = dp[i-1];
dp[i] += cnt*(m-1);
}
dp[i] %= deno;
cnt %= deno;
}
cout << dp[n-1];
}
구글링 해도 아마 안나오는 것 같아서 올려둔다.
이렇게 dp 로 푸는 방법 말고
1. 모두 맞는 경우
2. 하나틀린 경우
이런식으로 나눠서 푸는 방법도 존재하는데 이건 뭔가 풀면서 생각하기는 어렵다고 생각해서 패스했다.
이문제에서 좀 조심해야 할 점은 그냥 int 형을 쓰면 계속 맞왜틀해서 혹시 long long 쓰면 AC 받을까 해서 돌려본 결과
int 형 범위 문제였던 것 같다.
의외로 계속 dp 에서 정수형 범위제한을 틀리는데 조금더 조심해야 될 것 같다.
'알고리즘&자료구조 > 문제풀이' 카테고리의 다른 글
14502 c++ 연구소 - 조합으로 풀기 (1) | 2023.12.10 |
---|---|
[cpp] 백준 5247 - 불 ( 예외처리를 중심으로. ) (0) | 2022.03.02 |
[python] 7576 토마토 - 백준 / 출발지점이 여러개인 bfs 가 헷갈릴 때 다시볼것 (1) | 2022.02.03 |