結果
問題 | No.260 世界のなんとか3 |
ユーザー |
![]() |
提出日時 | 2016-05-14 17:04:40 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 84 ms / 2,000 ms |
コード長 | 1,366 bytes |
コンパイル時間 | 1,782 ms |
コンパイル使用メモリ | 168,580 KB |
実行使用メモリ | 11,008 KB |
最終ジャッジ日時 | 2024-11-07 18:11:51 |
合計ジャッジ時間 | 3,563 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<b;i++) #define MOD 1000000007LL typedef long long ll; // dp[digits][? < x][mod 24][3 exist] ll dp[10001][2][24][2]; ll solve(string x, bool flag) { int N = x.length(); rep(i1, 0, N+1) rep(i2, 0, 2) rep(i3, 0, 24) rep(i4, 0, 2) dp[i1][i2][i3][i4] = 0; dp[0][1][0][0] = 1; rep(i1, 0, N) rep(i2, 0, 2) rep(i3, 0, 24) rep(i4, 0, 2) { int c = x[i1] - '0'; //if (dp[i1][i2][i3][i4]) cout << " [!!]" << endl; rep(i, 0, 10) { if (i2 == 1 && c < i) break; int ii1 = i1 + 1; int ii2 = 0; if (i2 == 1 && c == i) ii2 = 1; int ii3 = (i3 * 10 + i) % 24; int ii4 = i4; if (i == 3) ii4 = 1; dp[ii1][ii2][ii3][ii4] = (dp[ii1][ii2][ii3][ii4] + dp[i1][i2][i3][i4]) % MOD; } } ll ret = 0; rep(i2, 0, 2) rep(i3, 0, 24) rep(i4, 0, 2) { if ((i3 % 3 == 0 || i4 == 1) && i3 % 8 != 0) { if( !(flag && i2==1) ) ret = (ret + dp[N][i2][i3][i4]) % MOD; /* if (dp[N][i2][i3][i4]) printf(" dp[N][%d][%d][%d] = %d\n", i2, i3, i4, dp[N][i2][i3][i4]); */ } } return ret; } int main() { cin.tie(0); ios::sync_with_stdio(false); /*rep(i, 1, 30) { cout << i << "=" << solve(to_string(i)) << endl; } return 0;*/ string A, B; cin >> A >> B; ll ans = (solve(B, false) - solve(A, true) + MOD) % MOD; cout << ans << endl; }