結果
| 問題 | No.315 世界のなんとか3.5 |
| コンテスト | |
| ユーザー |
koyumeishi
|
| 提出日時 | 2015-09-21 23:47:16 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.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;
}
koyumeishi