優YoU http://blog.csdn.net/lyy289065406/article/details/6698787
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<vector>
#include<math.h>
#include<stack>
using namespace std;
const int MAX = 1000+10;
const double eps = 1e-10;
const double PI = acos(-1.0);
int k, num[111], len, mod;
char s[111];
int get_mod[111][11], flag[111][10011];
void init()
{
for(int j = 0; j<10; ++j)
get_mod[0][j] = j%k;
for(int i = 1; i<101; ++i)
for(int j = 0; j<10; ++j)
get_mod[i][j] = get_mod[i-1][j]*10%k;
}
int ttt =0;
bool dfs(int NUM, int pos, int mod)
{
if(mod==0)
{
for(int i = len-1; i>=0; --i)
printf("%d", num[i]);
printf("\n");
return true;
}
if(pos==-1||NUM==0)return false;
if(NUM<=flag[pos][mod])return false;
for(int i = pos; i>=0; --i)
for(int j = 0; j<num[i]; ++j)
{
if(i==len-1&&j==0)continue;
int res = (mod-get_mod[i][num[i]]+get_mod[i][j]+k)%k;
int temp = num[i];
num[i] = j;
if(dfs(NUM-1, i-1, res))return true;
num[i] = temp;
}
for(int i = 0; i<=pos; ++i)
for(int j = num[i]+1; j<=9; ++j)
{
if(i==len-1&&j==0)continue;
int res = (mod-get_mod[i][num[i]]+get_mod[i][j]+k)%k;
int temp = num[i];
num[i] = j;
if(dfs(NUM-1, i-1, res))return true;
num[i] = temp;
}
flag[pos][mod] = max(flag[pos][mod], NUM);
return false;
}
int main()
{
while(~scanf("%s%d", s, &k))
{
init();
len = strlen(s);
mod = 0;
memset(flag, -1, sizeof(flag));
for(int i = 0; i<len; ++i)
num[i] = s[len-i-1]-'0';
for(int i = 0; i<len; ++i)
mod = (mod+get_mod[i][num[i]])%k;
for(int i = 0; ; ++i)
if(dfs(i, len-1, mod))break;
}
return 0;
}