比赛 20120806 评测结果 AAAAAAAAAA
题目名称 符文之语 最终得分 100
用户昵称 Makazeu 运行时间 0.436 s
代码语言 C++ 内存使用 4.43 MiB
提交时间 2012-08-06 11:54:07
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int MAXN=1011;
string str; int len;
int M,md[MAXN][MAXN],F[MAXN][55];
const int INF=10000;
int flag[55];

inline void init()
{
	cin>>str>>M;
	len=str.length();
	for(int i=1;i<=len;i++)
		for(int j=i;j<=len;j++)
			md[i][j]=(md[i][j-1]*10+str[j-1]-'0')%M;
	for(int i=0;i<=len;i++)
		for(int j=0;j<=M;j++)
			F[i][j]=INF;
	/*
	for(int i=1;i<=len;i++)
	{
		for(int j=i;j<=len;j++)
			printf("%d ",md[i][j]);
		printf("\n");
	}*/
}

inline void dp()
{
	F[0][1]=0;
	for(int i=1;i<=len;i++)
	{
		for(int j=0;j<=i-1;j++)
		{
			for(int k=0;k<=M-1;k++)
			{
				if(F[j][k]+1>=F[i][(k*md[j+1][i])%M]) continue;
				F[i][(k*md[j+1][i])%M]=F[j][k]+1;
				if(i==len) flag[(k*md[j+1][i])%M]=1;
			}
		}
	}
}

inline int Min(int a,int b) {return a<b?a:b;}
inline int Max(int a,int b) {return a>b?a:b;}

int main()
{
	freopen("chars.in","r",stdin);
	freopen("chars.out","w",stdout);
	init();
	dp();
	int minn=1000000,maxx=0;
	for(int i=0;i<=M-1;i++)
	{
		if(flag[i]) 
			minn=Min(minn,i),
			maxx=Max(maxx,i);
	}
	printf("%d %d %d %d\n",minn,F[len][minn]-1,maxx,F[len][maxx]-1);
	return 0;
}