diff --git a/src/7/30/U134267.cpp b/src/7/30/U134267.cpp index fead35f..e7dbceb 100644 --- a/src/7/30/U134267.cpp +++ b/src/7/30/U134267.cpp @@ -84,7 +84,7 @@ int main() { } ll ans = (e1 + emax) % MOD; - cout << ((ans^1)|ans) << endl; + cout << ans << endl; return 0; } \ No newline at end of file diff --git a/src/7/30/U281313.cpp b/src/7/30/U281313.cpp index 493fbeb..0a7980e 100644 --- a/src/7/30/U281313.cpp +++ b/src/7/30/U281313.cpp @@ -1,26 +1,23 @@ -#include #include -#include #include - using namespace std; -using ll = int64_t; -static inline constexpr ll MOD = 1e9+7; +using ll = long long; -static inline constexpr ll fpow(ll b, ll e, ll mod) { +constexpr inline static ll mod = 1e9+7; + +constexpr inline static ll fpow(ll base, ll exp, ll m) { + base %= m; ll res = 1; - b %= mod; - while (e) { - if (e & 1) - res = (res * b) % mod; - b = (b * b) % mod; - e >>= 1; + while (exp) { + if (exp & 1) res = (res * base) % m; + base = (base * base) % m; + exp >>= 1; } return res; } int main() { - ios_base::sync_with_stdio(false); + ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; @@ -28,69 +25,38 @@ int main() { string s; ll p; cin >> s >> p; - int n = s.size(); + ll n = s.size(); if (n == 0) { cout << "1\n"; continue; } + ll inv10 = fpow(10, p-2, p); + unordered_map cnt, cnt1; + cnt[0] = 1; + cnt1[0] = 1; + ll total = 1; + ll h = 0; + ll cur_inv = 1; + ll ans = 0; - vector p10(n+1); - p10[0] = 1; - for (int i = 1; i <= n; i++) { - p10[i] = (p10[i-1] * 10) % p; - } + for (int i = 0; i < n; i++) { + ll d = s[i] - '0'; + cur_inv = (cur_inv * inv10) % p; + h = (h + d * cur_inv) % p; + // if (h < 0) h += p; - ll inv10b = fpow(10, p-2, p); + ll dp1_cur = cnt[h]; + ll dp0_cur = (total - cnt1[h] + mod) % mod; - vector inv10(n+1); - inv10[0] = 1; - for (int i = 1; i <= n; i++) { - inv10[i] = (inv10[i-1] * inv10b) % p; - } - - vector pre(n+1, 0); - for (int i = 1; i <= n; i++) { - pre[i] = (pre[i-1] * 10 + (s[i-1] - '0')) % p; - } - - vector val(n+1); - for (int i = 0; i <= n; i++) { - val[i] = pre[i] * inv10[i] % p; // - if (val[i] < 0) val[i] += p; - } - - unordered_map> dic; - ll tot1 = 1; - dic[val[0]] = make_pair(1, 1); - - ll ndp0 = 0, ndp1 = 0; - for (int i = 1; i <= n; i++) { - ll v = val[i]; - ll s01 = 0, s1 = 0; - auto it = dic.find(v); - if (it != dic.end()) { - s01 = it->second.first; - s1 = it->second.second; + if (i == n-1) { + ans = (dp0_cur + dp1_cur) % mod; } - ndp1 = s01 % MOD; - ndp0 = (tot1 - s1) % MOD; - if (ndp0 < 0) - ndp0 += MOD; - - tot1 = (tot1 + ndp1) % MOD; - - ll add01 = (ndp0 + ndp1) % MOD; - ll add1 = ndp1 % MOD; - if (dic.find(v) != dic.end()) { - dic[v].first = (dic[v].first + add01) % MOD; - dic[v].second = (dic[v].second + add1) % MOD; - } else { - dic[v] = make_pair(add01, add1); - } + cnt[h] = (cnt[h] + dp0_cur + dp1_cur) % mod; + cnt1[h] = (cnt1[h] + dp1_cur) % mod; + total = (total + dp1_cur) % mod; } - ll ans = (ndp0 + ndp1) % MOD; cout << ans << '\n'; } return 0; diff --git a/src/7/30/U281313d.cpp b/src/7/30/U281313d.cpp new file mode 100644 index 0000000..493fbeb --- /dev/null +++ b/src/7/30/U281313d.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +using namespace std; +using ll = int64_t; +static inline constexpr ll MOD = 1e9+7; + +static inline constexpr ll fpow(ll b, ll e, ll mod) { + ll res = 1; + b %= mod; + while (e) { + if (e & 1) + res = (res * b) % mod; + b = (b * b) % mod; + e >>= 1; + } + return res; +} + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(nullptr); + int T; + cin >> T; + while (T--) { + string s; + ll p; + cin >> s >> p; + int n = s.size(); + if (n == 0) { + cout << "1\n"; + continue; + } + + vector p10(n+1); + p10[0] = 1; + for (int i = 1; i <= n; i++) { + p10[i] = (p10[i-1] * 10) % p; + } + + ll inv10b = fpow(10, p-2, p); + + vector inv10(n+1); + inv10[0] = 1; + for (int i = 1; i <= n; i++) { + inv10[i] = (inv10[i-1] * inv10b) % p; + } + + vector pre(n+1, 0); + for (int i = 1; i <= n; i++) { + pre[i] = (pre[i-1] * 10 + (s[i-1] - '0')) % p; + } + + vector val(n+1); + for (int i = 0; i <= n; i++) { + val[i] = pre[i] * inv10[i] % p; // + if (val[i] < 0) val[i] += p; + } + + unordered_map> dic; + ll tot1 = 1; + dic[val[0]] = make_pair(1, 1); + + ll ndp0 = 0, ndp1 = 0; + for (int i = 1; i <= n; i++) { + ll v = val[i]; + ll s01 = 0, s1 = 0; + auto it = dic.find(v); + if (it != dic.end()) { + s01 = it->second.first; + s1 = it->second.second; + } + + ndp1 = s01 % MOD; + ndp0 = (tot1 - s1) % MOD; + if (ndp0 < 0) + ndp0 += MOD; + + tot1 = (tot1 + ndp1) % MOD; + + ll add01 = (ndp0 + ndp1) % MOD; + ll add1 = ndp1 % MOD; + if (dic.find(v) != dic.end()) { + dic[v].first = (dic[v].first + add01) % MOD; + dic[v].second = (dic[v].second + add1) % MOD; + } else { + dic[v] = make_pair(add01, add1); + } + } + + ll ans = (ndp0 + ndp1) % MOD; + cout << ans << '\n'; + } + return 0; +} \ No newline at end of file