
Write a program to make a non-negative integer which is a multiple of m. The integer should be as big as possible.
6 3 5 6 0
Case 1: 111 Case 2: -1
// 仰慕秦牛 不解释
//秦牛's code 我的java没法过了
f[i][j]为用了i根火柴对m取模为j时能组成的最大的数.
状态转移: f[i+a[k]][(j*10+k)%m] = max(f[i+a[k]][(j*10+k)%m], f[i][j]*10+k)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int n,m;
struct bignum
{
int l;
char a[60];
void stlize()
{
while (a[l-1]==0) l--;
}
void set(char v)
{
memset(a,0,sizeof(a));
l=1;
a[0]=v;
if (v==0) l=0;
}
void add(char v)
{
char i;
a[0]+=v;
for (i=0;i<l;++i)
{
if (a[i]>=10)
{
a[i+1]++;
a[i]-=10;
}
else break;
}
if (a[l]>0) l++;
stlize();
}
void mul10()
{
for (int i=l;i>0;--i)
a[i]=a[i-1];
a[0]=0;
l++;
stlize();
}
bool bigger(bignum ta)
{
ta.stlize();stlize();
if (ta.l!=l) return l>ta.l;
for (int i=l-1;i>=0;--i)
if (ta.a[i]!=a[i]) return a[i]>ta.a[i];
}
void give(bignum ta)
{
l=ta.l;
memcpy(a,ta.a,sizeof(char)*60);
}
void output()
{
if (a[0]==-1||l==0)
{
if (n>=6) puts("0");
else puts("-1");
return;
}
for (int i=l-1;i>=0;--i)
printf("%d",(char)a[i]);
puts("");
}
};
bignum dp[101][3003];
long long neednum[10]={6,2,5,5,4,5,6,3,7,6};
int nc=1;
int i,j,k;
int main()
{
while (scanf("%d",&n),n)
{
scanf("%d",&m);
for (i=1;i<=n;++i)
for (j=0;j<m;++j)
dp[i][j].set(-1);
for (i=0;i<10;++i)
dp[neednum[i]][i%m].set((char)i);
for (i=1;i<=n;++i)
for (j=0;j<m;++j)
if (dp[i][j].a[0]!=-1)
{
for (k=0;k<10;++k)
{
int ns=i+neednum[k];
int nn=(j*10%m+k)%m;
if (ns>n) continue;
bignum temp;
temp.give(dp[i][j]);
temp.mul10();
temp.add((char)k);
if (temp.bigger(dp[ns][nn]))
dp[ns][nn].give(temp);
}
}
bignum ans;
ans.set(-1);
for (i=1;i<=n;++i)
if (dp[i][0].bigger(ans)) ans.give(dp[i][0]);
printf("Case %d: ",nc++);
ans.output();
}
return 0;
}