結果
| 問題 |
No.260 世界のなんとか3
|
| コンテスト | |
| ユーザー |
medo_program05
|
| 提出日時 | 2020-02-14 18:36:19 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 280 ms / 2,000 ms |
| コード長 | 2,978 bytes |
| コンパイル時間 | 1,781 ms |
| コンパイル使用メモリ | 172,180 KB |
| 実行使用メモリ | 11,156 KB |
| 最終ジャッジ日時 | 2024-10-06 09:46:03 |
| 合計ジャッジ時間 | 5,598 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int mod = (int)1e9+7;
int main(){
string s,t;
cin >> s >> t;
int T = t.size();
int S = s.size();
ll dp[10010][2][3][2][8];
memset(dp,0,sizeof(dp));
dp[0][0][0][0][0] = 1LL;
for(int digit = 0; digit < T; digit++){ //桁
for(int less = 0; less < 2; less++){ //未満
for(int mod3 = 0; mod3 < 3; mod3++){ //3で割った余り
for(int ex3 = 0; ex3 < 2; ex3++){ //3が過去に出てきたか
for(int mod8 = 0; mod8 < 8; mod8++){ //8で割った余り
int lim = t[digit] - '0';
for(int x = 0; x <= (less?9:lim); x++){
dp[digit][less][mod3][ex3][mod8] %= mod;
dp[digit+1][less || x < lim][(mod3+x)%3][ex3 || x == 3][(10*mod8+x)%8] += dp[digit][less][mod3][ex3][mod8];
}
}
}
}
}
}
ll anst = 0;
//(3がつくまたは3の倍数) && (8の倍数ではない)
//(exist3)+(mod3 == 0)-(exist3 && mod3 == 0)
//mod3
for(int i = 0; i < 2; i++){
for(int j = 1; j < 8; j++){
anst += dp[T][0][0][i][j] + dp[T][1][0][i][j];
anst %= mod;
}
}
//exist3
for(int i = 0; i < 3; i++){
for(int j = 1; j < 8; j++){
anst += dp[T][0][i][1][j] + dp[T][1][i][1][j];
anst %= mod;
}
}
//exsit3 && mod3
for(int i = 1; i < 8; i++) anst -= dp[T][0][0][1][i] + dp[T][1][0][1][i];
anst += mod;
anst %= mod;
memset(dp,0,sizeof(dp));
dp[0][0][0][0][0] = 1LL;
for(int digit = 0; digit < S; digit++){
for(int less = 0; less < 2; less++){
for(int mod3 = 0; mod3 < 3; mod3++){
for(int ex3 = 0; ex3 < 2; ex3++){
for(int mod8 = 0; mod8 < 8; mod8++){
int lim = s[digit] - '0';
for(int x = 0; x <= (less?9:lim); x++){
dp[digit][less][mod3][ex3][mod8] %= mod;
dp[digit+1][less || x < lim][(mod3+x)%3][ex3 || x == 3][(10*mod8+x)%8] += dp[digit][less][mod3][ex3][mod8];
}
}
}
}
}
}
ll anss = 0;
//(3がつくまたは3の倍数) && (8の倍数ではない)
//(exist3)+(mod3 == 0)-(exist3 && mod3 == 0)
//mod3
for(int i = 0; i < 2; i++){
for(int j = 1; j < 8; j++){
anss += dp[S][1][0][i][j];
anss %= mod;
}
}
//exist3
for(int i = 0; i < 3; i++){
for(int j = 1; j < 8; j++){
anss += dp[S][1][i][1][j];
anss %= mod;
}
}
//exsit3 && mod3
for(int i = 1; i < 8; i++) anss -= dp[S][1][0][1][i];
anss += mod;
anss %= mod;
cout << (anst-anss+mod)%mod << endl;
}
medo_program05