[CERC2015]Digit Division

题目链接:

题目

分析:

首先考虑这样一个东西
如果\(t|a, t|b\),那么显然\(a,b\)拼起来也整除\(t\)
那么如果\(t|a\)\(a,b\)拼起来不整除\(t\),一定有\(t\)不整除\(b\)
于是事情一下好办了起来,类似读优的方式从左到右扫描并拆位,如果当前拆下来的左半边能整除就增量答案\(cnt\)
如果最后整个数不整除\(t\),那么拆不了,直接输出\(0\)
否则答案为\(2^{cnt - 1}\),最后整个数那一下不算拆,所以不统计

代码:

#include<bits/stdc++.h>
#define mod (1000000000 + 7)
#define N (300000 + 10)
#define int long long
using namespace std;
inline int read() {
	int cnt = 0, f = 1; char c = getchar();
	while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
	while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
	return cnt * f;
}
int n, m;
long long qpow(int a, int b) {
	long long ans = 1;
	while (b) {
		if (b & 1) ans = (ans * (a % mod) % mod);
		a = ((a % mod) * (a % mod)) % mod; b >>= 1;
	}
	return ans % mod;
}
char ch[N];
int cur = 0, cnt = 0;
signed main() {
	n = read(), m = read();
	scanf("%s", ch + 1);
	for (register int i = 1; i <= n; ++i) {
		cur = ((cur << 3) + (cur << 1) + (ch[i] ^ 48)) % m;
		cnt += (!cur);
	}
	if (cur) return printf("0"), 0;
	printf("%lld", qpow(2, cnt - 1) % mod);
	return 0;
}
posted @ 2019-10-06 10:05  kma_093  阅读(102)  评论(0编辑  收藏  举报