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

时间:2022-01-23 06:46:00

传送门

解题思路

  差点写树套树。。。可以发现如果几个数都能被\(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;
}