結果
問題 | No.315 世界のなんとか3.5 |
ユーザー |
![]() |
提出日時 | 2015-09-21 23:47:16 |
言語 | C++11 (gcc 13.3.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,573 bytes |
コンパイル時間 | 402 ms |
コンパイル使用メモリ | 56,924 KB |
実行使用メモリ | 182,272 KB |
最終ジャッジ日時 | 2024-07-19 08:32:32 |
合計ジャッジ時間 | 35,261 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 TLE * 6 |
ソースコード
//くろとんさんのコード//テストありがとうございます//制約厳しくして落ちるか確認#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int MOD = 1e9 + 7;string dig;int border;bool allowEqual;int dp[200010][3][8][2][2][2];int solve(int k, int mod3, int mod8, bool has3, bool less, bool suf0){if(k >= dig.size()){if(!less && !allowEqual){return 0;}int aho = (mod3 == 0) || has3;int haji = (mod8 == 0) && suf0;return aho && !haji;}if(dp[k][mod3][mod8][has3][less][suf0] != -1){return dp[k][mod3][mod8][has3][less][suf0];}int res = 0;for(int i=0;i<10;i++){int d = dig[k] - '0';if(less || i <= d){bool nsuf0 = suf0;int nmod8 = mod8;if(k >= border){nsuf0 &= i == 0;} else {nmod8 = (nmod8 * 10 + i) % 8;}res += solve(k + 1, (mod3 * 10 + i) % 3, nmod8, has3 || (i == 3), less || (i < d), nsuf0);if(res >= MOD){res -= MOD;}}}return dp[k][mod3][mod8][has3][less][suf0] = res;}int solve(string s, int p, bool eq){dig = s;border = dig.size() - p;allowEqual = eq;memset(dp, -1, sizeof(dp));return solve(0, 0, 0, false, false, true);}int main(){string A, B;cin >> A >> B;int P;cin >> P;int p = 0;while(P > 0){++p;P /= 10;}int resA = solve(A, p - 1, false);int resB = solve(B, p - 1, true);int res = resB - resA;if(res < 0){res += MOD;}cout << res << endl;return 0;}