BZOJ 4421: [Cerc2015] Digit Division(思路)

传送门

解题思路

  差点写树套树。。。可以发现如果几个数都能被\(m\)整除,那么这几个数拼起来也能被\(m\)整除。同理,如果一个数不能被\(m\)整除,那么它无论如何拆,都无法拆成若干个可以被\(m\)整除的数。这样的话只需要看那些被\(m\)整除的前缀个数,然后选与不选直接\(2^cnt\)即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>

using namespace std;
const int N=300005;
const int MOD=1e9+7;
typedef long long LL;

int n,m,cnt,now;
char s[N];

int fast_pow(int x,int y){
	int ret=1;
	for(;y;y>>=1){
		if(y&1) ret=(LL)ret*x%MOD;
		x=(LL)x*x%MOD;
	}
	return ret;
}

int main(){
	scanf("%d%d%s",&n,&m,s+1);
	for(int i=1;i<=n;i++){
		now=(now*10+s[i]-'0')%m;
		if(!now) cnt++;
	}
	if(now) puts("0");
	else printf("%d\n",fast_pow(2,cnt-1));
	return 0;
}
posted @ 2019-01-12 16:15  Monster_Qi  阅读(116)  评论(0编辑  收藏  举报