记录编号 |
41635 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2010冲刺二]符文之语 |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.442 s |
提交时间 |
2012-08-06 17:01:33 |
内存使用 |
4.43 MiB |
显示代码纯文本
#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;
}