結果

問題 No.260 世界のなんとか3
ユーザー ふーらくたる
提出日時 2016-06-29 14:03:27
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 48 ms / 2,000 ms
コード長 2,661 bytes
コンパイル時間 713 ms
コンパイル使用メモリ 63,064 KB
実行使用メモリ 11,136 KB
最終ジャッジ日時 2024-11-07 18:12:18
合計ジャッジ時間 2,588 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 27
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

/*
* No.260 3
*
* )
* ways[i+1][a_greater][b_greater][mod3][mod8][has_three]
*/
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int kMOD = 1000 * 1000 * 1000 + 7;
const int kMAX_INDEX = 10010;
string A, B;
int ways[kMAX_INDEX][2][2][3][8][2];
void Solve() {
vector<int> int_A, int_B;
// AB
for (int i = 0; i < B.size(); i++) {
if (i + A.size() < B.size()) int_A.push_back(0);
else int_A.push_back(A[i - B.size() + A.size()] - '0');
int_B.push_back(B[i] - '0');
}
// dp
ways[0][0][0][0][0][0] = 1;
for (int i = 0; i < int_A.size(); i++) {
for (int greater = 0; greater < 2; greater++) {
for (int smaller = 0; smaller < 2; smaller++) {
for (int mod3 = 0; mod3 < 3; mod3++) {
for (int mod8 = 0; mod8 < 8; mod8++) {
for (int has_three = 0; has_three < 2; has_three++) {
if (ways[i][greater][smaller][mod3][mod8][has_three] == 0) continue;
for (int digit = 0; digit < 10; digit++) {
if (!greater && digit < int_A[i]) continue;
if (!smaller && digit > int_B[i]) break;
ways[i + 1][greater | digit > int_A[i]][smaller | digit < int_B[i]][(mod3 * 10 + digit) % 3][(mod8 * 10 + digit) %
                                    8][has_three | digit == 3] += ways[i][greater][smaller][mod3][mod8][has_three];
ways[i + 1][greater | digit > int_A[i]][smaller | digit < int_B[i]][(mod3 * 10 + digit) % 3][(mod8 * 10 + digit) %
                                    8][has_three | digit == 3] %= kMOD;
}
}
}
}
}
}
}
int answer = 0;
for (int greater = 0; greater < 2; greater++) {
for (int smaller = 0; smaller < 2; smaller++) {
// 3
for (int mod8 = 1; mod8 < 8; mod8++) {
for (int has_three = 0; has_three < 2; has_three++) {
answer = (answer + ways[int_A.size()][greater][smaller][0][mod8][has_three]) % kMOD;
}
}
// 3
for (int mod3 = 1; mod3 < 3; mod3++) {
for (int mod8 = 1; mod8 < 8; mod8++) {
answer = (answer + ways[int_A.size()][greater][smaller][mod3][mod8][1]) % kMOD;
}
}
}
}
cout << answer << endl;
}
int main() {
cin >> A >> B;
Solve();
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0