让人很无奈的是一开始初始化初始化的不对。。。。
还是比较水的题目。。,。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 201
int num[maxn],k,n;
int nums[maxn];
int mod[maxn][11];
int vis[105][10010][10];
void init(char str[])
{
int i;
n=strlen(str);
for(i=0;i<n;i++)
{
num[i]=str[i]-'0';
nums[i]=num[i];
}
scanf("%d%*c",&k);
int j,ns;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
ns=1%k;
j=0;
while(j<n-i)
{
j++;
ns=ns*10%k;
}
mod[i][1]=ns;
for(j=2;j<10;j++)mod[i][j]=(mod[i][1]*j)%k;
}
for(i=1;i<10;i++)mod[n][i]=i%k;
}
int dfs(int ipos,int lens,int nmod)
{
if(n-ipos<lens)return 0;
if(vis[ipos][nmod][lens]==1)return 0;
vis[ipos][nmod][lens]=1;
if(nmod==0)return 1;
if(lens==0)return 0;
int ns;
int i,j;
i=ipos;
if(ipos==0)j=1;
else j=0;
for(j;j<num[i];j++)
{
ns=nmod;
ns=nmod-mod[i+1][num[i]-j];
if(ns<0)ns=ns+k;
nums[i]=j;
if(dfs(i+1,lens-1,ns))return 1;
nums[i]=num[i];
}
if(dfs(i+1,lens,nmod))return 1;
for(j=num[i]+1;j<=9;j++)
{
ns=nmod;
ns=nmod+mod[i+1][j-num[i]];
if(ns>=k)ns=ns-k;
nums[i]=j;
if(dfs(i+1,lens-1,ns))return 1;
nums[i]=num[i];
}
return 0;
}
int main()
{
char str[1001];
while(gets(str)!=NULL)
{
int nmod;
init(str);
int i;
if(n==1)
{
if(num[0]==k)cout<<k<<endl;
else
cout<<"0"<<endl;
continue;
}
nmod=0;
for(i=0;i<n;i++)
{
nmod=nmod*10+num[i];
nmod=nmod%k;
}
for(i=0;i<=n;i++)
{
if(dfs(0,i,nmod))break;
}
for(i=0;i<n;i++)
{
printf("%d",nums[i]);
}
cout<<endl;
}
return 0;
}