結果
| 問題 |
No.319 happy b1rthday 2 me
|
| コンテスト | |
| ユーザー |
moti
|
| 提出日時 | 2015-12-14 18:50:16 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 2,763 bytes |
| コンパイル時間 | 877 ms |
| コンパイル使用メモリ | 103,496 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-15 12:37:41 |
| 合計ジャッジ時間 | 1,844 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <complex>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <iomanip>
#include <assert.h>
#include <array>
#include <cstdio>
#include <cstring>
#include <random>
#include <functional>
#include <numeric>
#include <bitset>
using namespace std;
#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define rep(i,n) REP(i,0,n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
#define minimize(a, x) a = std::min(a, x)
#define maximize(a, x) a = std::max(a, x)
typedef long long ll;
int const inf = 1<<29;
ll solve(string const& S, bool last) {
const int N = S.size();
ll ret = 0;
ll dp[14][2][2][14*14]; // i桁目, 最大値未満, 前の桁が'1', "12"の個数
zero(dp);
dp[0][0][0][0] = 1;
rep(i, N) rep(less, 2) rep(prevone, 2) rep(twcount, 14*14) {
auto const& curr = dp[i][less][prevone][twcount];
const int dmax = less ? 9 : (S[i] - '0');
rep(d, dmax + 1) {
auto const ni = i + 1;
auto const nprevone = d == 1;
auto const nless = less || (d < dmax);
auto const ntwcount = twcount + (prevone && d == 2);
auto& next = dp[ni][nless][nprevone][ntwcount];
next += curr;
}
}
rep(i, 2) rep(j, 2) rep(k, 14*14) {
ret += dp[N][i][j][k] * k;
}
if(last) {
rep(i, 2) rep(j, 14*14) {
ret -= dp[N][0][i][j] * j;
}
}
return ret;
}
ll count2_2(string const& S, bool last) {
int N = S.size();
ll dp[14][2][2][2][2]; // i桁目, 最大値未満, 前の桁が'2', leading0, はじめの桁が'2'
zero(dp);
dp[0][0][0][1][0] = 1;
rep(i, N) rep(less, 2) rep(prev2, 2) rep(leading0, 2) rep(start2, 2) {
auto const& curr = dp[i][less][prev2][leading0][start2];
int dmax = less ? 9 : (S[i] - '0');
rep(d, dmax + 1) {
auto const ni = i + 1;
auto const nless = less || (d < dmax);
auto const nprev2 = d == 2;
auto const nleading0 = leading0 && (d == 0);
auto const nstart2 = start2 || (leading0 && (d == 2));
auto& next = dp[ni][nless][nprev2][nleading0][nstart2];
next += curr;
}
}
ll ret = 0;
rep(i, 2) {
if(last && i == 0) { continue; }
ret += dp[N][i][1][0][1];
}
return ret;
}
int main() {
string A, B; cin >> A >> B;
/*
cout << solve(A, false) << endl;
cout << solve(B, false) << endl;
cout << "::" << count2_2(A, true) << endl;
cout << count2_2(B, false) << endl;
*/
cout << solve(B, false) - solve(A, true) + count2_2(B, false) - (count2_2(A, true) + (A[0] == '2' && A.back() == '2')) << endl;
return 0;
}
moti