1. 程式人生 > 實用技巧 >P4349 [CERC2015]Digit Division

P4349 [CERC2015]Digit Division

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;
}