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;
}
希望我们都有一个光明的未来