记录编号 41635 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺二]符文之语 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 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;
}