P4349 [CERC2015]Digit Division
阿新 • • 發佈:2020-09-16
P4349 CERC2015 Digit Division
思維提高,程式碼難度入門。
正解:快速冪。
考慮一個區間,如果模 \(M\) 等於0,那麼就可以作為決策點,而決策點前後加合法段也是合法段。那麼直接對於每一個字首求一個模M的值,當值為0即可作為決策點。
判無解:如果最後一個區間(也就是末尾和最後一個決策點之間)模 \(M\) 不為0,那麼就無解,因為無法將整個序列劃分完整。
其他情況就是 2^(總決策點數-1)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; const ll MAXN = 1e6+10; const ll MOD = 1e9+7; ll N, M, sum, cnt; char ss[MAXN]; int main() { scanf("%lld%lld", &N, &M); scanf("%s", ss+1); for (ll i = 1; i <= N; i++) { sum = sum * 10 + (ss[i] - '0'); sum = sum % M; if (sum == 0) { cnt++; } } if (sum) return !puts("0"); else { ll ans = 1; for (ll i = 1; i <= cnt-1; i++) { ans = (ans * 2) % MOD; } printf("%lld\n", ans); } return 0; }