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
",fast_pow(2,cnt-1));
	return 0;
}
原文地址:https://www.cnblogs.com/sdfzsyq/p/10260111.html