Submission #4030450


Source Code Expand

#include <iostream>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> pos;
const ll MOD = 1000000007, N = 200000, dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 };

ll mn(ll a, ll b) {
	if (a == -1)return b;
	if (b == -1)return a;
	return min(a, b);
}
ll gcd(ll v1, ll v2) {
	if (v1 == 0)return v2; if (v2 == 0)return v1; if (v2 > v1)return gcd(v2%v1, v1); return gcd(v1%v2, v2);
}
struct ab {
	ll a, b;
	bool operator<(const ab& right) const {
		return right.b*a - right.a*b < 0;
	}
};

/*
void src(ll v, ll d[]) {
priority_queue<pos> q;
q.push(make_pair(0, v));
while (!q.empty()) {
ll ci = q.top().second, cd = -q.top().first;
q.pop();
if (d[ci] != -1)continue; d[ci] = cd;
for (int i = 0; i < G[ci].size(); i++) {
ll ni = G[ci][i].second, nd = cd + G[ci][i].first;
if (d[ni] != -1)continue;
q.push(make_pair(-nd, ni));
}
}
}
*/

ll n, x, dp[254][254][254];//index x_count niconico

int main() {
	cin >> n >> x;
	dp[0][0][0] = 1;
	for (int i = 0; i < n; i++) {
		char v1; cin >> v1;
		if (v1 == '?') {
			for (ll j = 0; j <= 252; j++) {
				for (int k = 0; k <= 252; k++) {
					if (dp[i][j][k] == 0)continue;
					if (k % 2 == 1) {
						//add 5 
						dp[i + 1][min(x,j + k / 2 + 1)][k + 1] = (dp[i + 1][min(x, j + k / 2 + 1)][k + 1] + dp[i][j][k]) % MOD;
						//add 2
						dp[i + 1][j][1] = (dp[i + 1][j][1]+dp[i][j][k])%MOD;

						dp[i + 1][j][0] = (dp[i + 1][j][0] + dp[i][j][k] * 8) % MOD;
					}
					else {
						dp[i + 1][j][0] = (dp[i + 1][j][0] + dp[i][j][k]*9) % MOD;
						dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) % MOD;
					}
				}
			}
		}
		else {
			for (ll j = 0; j <= 252; j++) {
				for (int k = 0; k <= 252; k++) {
					if (dp[i][j][k] == 0)continue;
					if (k % 2 == 1 && v1 == '5') {
						dp[i + 1][min(x, j + k / 2 + 1)][k + 1] = (dp[i + 1][min(x, j + k / 2 + 1)][k + 1] + dp[i][j][k]) % MOD;
					}
					else if (v1 == '2') {
						if(k%2==0)dp[i + 1][j][k + 1] = (dp[i + 1][j][k + 1] + dp[i][j][k]) % MOD;
						else dp[i + 1][j][1] = (dp[i + 1][j][1] + dp[i][j][k]) % MOD;
					}
					else {
						dp[i + 1][j][0] = (dp[i + 1][j][0] + dp[i][j][k]) % MOD;
					}
				}
			}
		}
	}
	ll ans = 0;
	for (int i = 0; i <= 252; i++)ans = (ans + dp[n][x][i]) % MOD;
	cout << ans << endl;
	return 0;
}

Submission Info

Submission Time
Task A - ニコニコ文字列2
User J190563HN
Language C++14 (GCC 5.4.1)
Score 20
Code Size 2493 Byte
Status AC
Exec Time 49 ms
Memory 125696 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 20 / 20
Status
AC × 2
AC × 24
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt, subtask1_21.txt, subtask1_22.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 256 KB
sample_02.txt AC 3 ms 6400 KB
subtask1_01.txt AC 1 ms 256 KB
subtask1_02.txt AC 1 ms 256 KB
subtask1_03.txt AC 1 ms 256 KB
subtask1_04.txt AC 1 ms 256 KB
subtask1_05.txt AC 27 ms 90368 KB
subtask1_06.txt AC 21 ms 69888 KB
subtask1_07.txt AC 20 ms 65792 KB
subtask1_08.txt AC 11 ms 30976 KB
subtask1_09.txt AC 11 ms 30976 KB
subtask1_10.txt AC 7 ms 18688 KB
subtask1_11.txt AC 37 ms 125184 KB
subtask1_12.txt AC 38 ms 125312 KB
subtask1_13.txt AC 38 ms 125184 KB
subtask1_14.txt AC 38 ms 125440 KB
subtask1_15.txt AC 39 ms 125440 KB
subtask1_16.txt AC 39 ms 125440 KB
subtask1_17.txt AC 49 ms 125696 KB
subtask1_18.txt AC 37 ms 125184 KB
subtask1_19.txt AC 45 ms 125696 KB
subtask1_20.txt AC 39 ms 125440 KB
subtask1_21.txt AC 38 ms 125184 KB
subtask1_22.txt AC 37 ms 125184 KB