結果
問題 | No.260 世界のなんとか3 |
ユーザー |
![]() |
提出日時 | 2015-07-31 23:23:15 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 56 ms / 2,000 ms |
コード長 | 4,847 bytes |
コンパイル時間 | 2,046 ms |
コンパイル使用メモリ | 94,144 KB |
実行使用メモリ | 14,848 KB |
最終ジャッジ日時 | 2024-11-07 18:00:20 |
合計ジャッジ時間 | 3,393 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#define _USE_MATH_DEFINES#define _CRT_SECURE_NO_DEPRECATE#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <limits>#include <ctime>#include <cassert>#include <map>#include <set>#include <iostream>#include <memory>#include <string>#include <vector>#include <algorithm>#include <functional>#include <sstream>#include <stack>#include <queue>#include <numeric>#include <iterator>#include <bitset>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int, int> Pii;typedef pair<ll, ll> Pll;#define FOR(i,n) for(int i = 0; i < (n); i++)#define sz(c) ((int)(c).size())#define ten(x) ((int)1e##x)#ifdef _WIN32# define mygc(c) (c)=getchar()# define mypc(c) putchar(c)#else# define mygc(c) (c)=getchar_unlocked()# define mypc(c) putchar_unlocked(c)#endifvoid reader(int& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for(;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }void reader(ll& x) { int k, m = 0; x = 0; for (;;) { mygc(k); if (k == '-') { m = 1; break; }if ('0' <= k&&k <= '9') { x = k - '0'; break; } }for(;;) { mygc(k); if (k<'0' || k>'9')break; x = x * 10 + k - '0'; }if (m) x = -x; }int reader(char c[]) { int i, s = 0; for (;;) { mygc(i); if (i != ' '&&i != '\n'&&i != '\r'&&i != '\t'&&i != EOF) break; }c[s++] = i; for (;;) { mygc(i); if (i == ' ' || i == '\n' || i == '\r' || i == '\t' || i == EOF) break; c[s++] = i; }c[s] = '\0'; return s; }template <class T, class S> void reader(T& x, S& y) { reader(x); reader(y); }template <class T, class S, class U> void reader(T& x, S& y, U& z) { reader(x); reader(y); reader(z); }template <class T, class S, class U, class V> void reader(T& x, S& y, U& z, V & w) { reader(x); reader(y); reader(z); reader(w); }void writer(int x, char c) { int s = 0, m = 0; char f[10]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }void writer(ll x, char c) { int s = 0, m = 0; char f[20]; if (x<0)m = 1, x = -x; while (x)f[s++] = x % 10, x /= 10; if (!s)f[s++] = 0; if (m)mypc('-'); while (s--)mypc(f[s] + '0'); mypc(c); }void writer(const char c[]) { int i; for (i = 0; c[i] != '\0'; i++)mypc(c[i]); }void writer(const char x[], char c) { int i; for (i = 0; x[i] != '\0'; i++)mypc(x[i]); mypc(c); }template<class T> void writerLn(T x) { writer(x, '\n'); }template<class T, class S> void writerLn(T x, S y) { writer(x, ' '); writer(y, '\n'); }template<class T, class S, class U> void writerLn(T x, S y, U z) { writer(x, ' '); writer(y, ' '); writer(z, '\n'); }template<class T> void writerArr(T x[], int n) { if (!n) { mypc('\n'); return; }FOR(i, n - 1)writer(x[i], ' '); writer(x[n - 1], '\n'); }ll mod_pow(ll a, ll n, ll mod) {ll ret = 1;ll p = a % mod;while (n) {if (n & 1) ret = ret * p % mod;p = p * p % mod;n >>= 1;}return ret;}// ax+by=gcd(a,b)となるx,yを求める(|x| <= b , |y| <= a)template<class T> T extgcd(T a, T b, T& x, T& y){ for (T u = y = 1, v = x = 0; a;) { T q = b / a; swap(x -= q * u, u); swap(y -= q * v, v); swap(b -=q * a, a); } return b; }// ay≡gcd(a,m)(mod m) ---> return y; //mod_powの方が速い場合があるtemplate<class T> T mod_inv(T a, T m){ T x, y; extgcd(a, m, x, y); return (m + x % m) % m; }vector<int> digits(string& m) {vector<int> ret;FOR(i, sz(m)) ret.push_back(m[i] - '0');reverse(ret.begin(), ret.end());return ret;}const int MOD = ten(9) + 7;ll digit_dp(string& m) {// m = sum(a[i] * 10^i)vector<int> a = digits(m);static ll buf[3][ten(4) + 10][24][2];memset(buf, 0, sizeof(buf));auto ls = buf[0], eq = buf[1], gt = buf[2];eq[0][0][0] = 1;int p = 1;FOR(i, sz(a)){FOR(j, 24) FOR(k, 2) {FOR(d, 10) {int nj = (j + d * p) % 24;int nk = k | (d == 3);if (d > a[i]) {(gt[i + 1][nj][nk] += ls[i][j][k] + eq[i][j][k] + gt[i][j][k]) %= MOD;} else if (d < a[i]) {(ls[i + 1][nj][nk] += ls[i][j][k] + eq[i][j][k] + gt[i][j][k]) %= MOD;} else {(ls[i + 1][nj][nk] += ls[i][j][k]) %= MOD;(eq[i + 1][nj][nk] += eq[i][j][k]) %= MOD;(gt[i + 1][nj][nk] += gt[i][j][k]) %= MOD;}}}p = p * 10 % 24;}ll ans = 0;ll all = 0;FOR(j, 24) FOR(k, 2) {if ((j % 3 == 0 || k == 1) && j % 8 != 0) {ans += ls[sz(m)][j][k] + eq[sz(m)][j][k];}all += ls[sz(m)][j][k] + eq[sz(m)][j][k];;}ans %= MOD;return ans;}void dec(string& s) {for (int i = sz(s) - 1; i >= 0; i--) {if (s[i] == '0') s[i] = '9';else {s[i]--;break;}}}int main(){string a, b; cin >> a >> b;dec(a);ll aans = digit_dp(a);ll bans = digit_dp(b);ll ans = (bans - aans + MOD) % MOD;cout << ans << endl;}