Submission #1591198
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned __int128 HASH;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pullull;
typedef pair<ll,int> plli;
typedef pair<double, int> pdbi;
typedef pair<int,pii> pipii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<pii> vpii;
typedef vector<vector<int>> mat;
#define rep(i,n) for (int i=0;i<(n);i++)
#define rep2(i,a,b) for (int i=(a);i<(b);i++)
#define rrep(i,n) for (int i=(n);i>0;i--)
#define rrep2(i,a,b) for (int i=(a);i>b;i--)
#define pb push_back
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
const ll hmod1 = 999999937;
const ll hmod2 = 1000000000 + 9;
const ll INF = 1<<30;
const ll mod = 10000;
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, 1, 0, -1};
const int dx8[8] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy8[8] = {0, 1, -1, 1, -1, 0, 1, -1};
const double pi = 3.141592653589793;
//#define int long long
#define addm(X, Y) ((X) = ((X) + (Y) % mod) % mod)
string a, b;
ll dp1[2][2][10][2][2][500 + 5], dp2[2][2][10][2][2][500 + 5];
int mo;
signed main(){
cin.tie(0);
ios::sync_with_stdio(false);
cin >> a >> b >> mo;
dp1[0][0][0][0][0][0] = 1;
dp1[0][0][0][1][0][0] = 1;
int cur = 1, pre = 0;
rep(i, b.size()){
rep(j, 2)rep(d, 10)rep(l, 2)rep(z, 2)rep(m, mo) dp1[cur][j][d][l][z][m] = 0;
rep(j, 2) {
int lim = j ? 9 : b[i] - '0';
rep(d, lim + 1)rep(k, 10)rep(z, 2) {
if (z != 0 && d == k) continue;
rep(l, 2) {
if (z != 0 && ((l == 0 && d < k) || (l == 1 && k < d))) continue;
rep(m, mo) {
if (z == 0 && d == 0) dp1[cur][1][0][l^1][0][0] = 1;
else addm(dp1[cur][j || d < lim][d][l^1][1][(10 * m + d) % mo], dp1[pre][j][k][l][z][m]);
}
}
}
}
swap(cur, pre);
}
int b_end = pre;
dp2[0][0][0][0][0][0] = 1;
dp2[0][0][0][1][0][0] = 1;
cur = 1;
pre = 0;
rep(i, a.size()) {
rep(j, 2)rep(d, 10)rep(l, 2)rep(z, 2)rep(m, mo) dp2[cur][j][d][l][z][m] = 0;
rep(j, 2) {
int lim = j ? 9 : a[i] - '0';
rep(d, lim + 1)rep(k, 10)rep(z, 2) {
if (z != 0 && d == k) continue;
rep(l, 2) {
if (z != 0 && ((l == 0 && d < k) || (l == 1 && k < d))) continue;
rep(m, mo) {
if (z == 0 && d == 0) dp2[cur][1][0][l^1][0][0] = 1;
else addm(dp2[cur][j || d < lim][d][l^1][1][(10 * m + d) % mo], dp2[pre][j][k][l][z][m]);
}
}
}
}
swap(cur, pre);
}
int a_end = pre;
ll ans = 0;
rep(j, 2)rep(d, 10)rep(z, 2)rep(l, 2) addm(ans, dp1[b_end][j][d][l][z][0]);
rep(j, 2)rep(d, 10)rep(z, 2)rep(l, 2) ans = (ans - dp2[a_end][j][d][l][z][0] + 2 * mod) % mod;
if (a.size() == 1) {
if (stoi(a) % mo == 0) addm(ans, 1);
if (b.size() == 1) {
rep2(i, stoi(a) + 1, stoi(b) + 1) {
if (i % mo != 0) continue;
ans = (ans - 1 + mod) % mod;
}
}
else {
rep2(i, stoi(a) + 1, 10) {
if (i % mo != 0) continue;
ans = (ans - 1 + mod) % mod;
}
}
}
else {
rep(l, 2) addm(ans, dp2[a_end][0][a[a.size() - 1] - '0'][l][1][0]);
}
cout << ans << endl;
}
Submission Info
Submission Time |
|
Task |
F - ジグザグ数 (Zig-Zag Numbers) |
User |
roto_37 |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
3814 Byte |
Status |
AC |
Exec Time |
2371 ms |
Memory |
1536 KB |
Judge Result
Set Name |
set01 |
set02 |
set03 |
set04 |
set05 |
Score / Max Score |
20 / 20 |
20 / 20 |
20 / 20 |
20 / 20 |
20 / 20 |
Status |
|
|
|
|
|
Set Name |
Test Cases |
set01 |
data1 |
set02 |
data2 |
set03 |
data3 |
set04 |
data4 |
set05 |
data5 |
Case Name |
Status |
Exec Time |
Memory |
data1 |
AC |
2 ms |
1536 KB |
data2 |
AC |
3 ms |
1152 KB |
data3 |
AC |
2371 ms |
1536 KB |
data4 |
AC |
1325 ms |
1536 KB |
data5 |
AC |
1698 ms |
1536 KB |