[CERC2015]Digit Division

题目描述

We are given a sequence of n decimal digits. The sequence needs to be partitioned into one or more contiguous subsequences such that each subsequence, when interpreted as a decimal number, is divisible by a given integer m.

Find the number of different such partitions modulo 10^9 +7. When determining if two partitions are different, we only consider the locations of subsequence boundaries rather than the digits themselves, e.g. partitions 2|22 and 22|2 are considered different.

输入输出格式

输入格式:

 

The first line contains two integers n and m (1≤n≤300000, 1≤m≤1000000) – the length of the sequence and the divisor respectively. The second line contains a string consisting of exactly n digits.

 

输出格式:

 

Output a single integer – the number of different partitions modulo 109 +7.

 

输入输出样例

输入样例#1: 
4 2
1246
输出样例#1: 
4
输入样例#2: 
4 7
2015
输出样例#2: 
0

说明

Central Europe Regional Contest 2015 Problem D

 

 

我们发现分出来的每段的末尾i 的前缀数字 s[i] 都必须是 m的倍数, 否则中间肯定有一段%m!=0(想一想为什么),然后这就是个SB题了233

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int ha=1000000007;
int n,m,T,num;
char ch;

inline int add(int x,int y){
	x+=y;
	return x>=ha?x-ha:x;
}

inline int C(int y){
	int an=1,x=2;
	for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
	return an;
}

int main(){
	scanf("%d%d",&n,&m);
	const int M=m;
	for(int i=1;i<=n;i++){
		ch=getchar();
		while(!isdigit(ch)) ch=getchar();
		num=((num*10)+ch-'0')%M;
		if(!num) T++;
	}
    if(num) puts("0");
	else printf("%d\n",C(T-1));
	return 0;
}

  

posted @ 2018-03-30 20:14  蒟蒻JHY  阅读(235)  评论(0编辑  收藏  举报