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;
}
posted @ 2020-09-16 20:45  Gensokyo_Alice  阅读(93)  评论(0编辑  收藏  举报