记录编号 |
243517 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队2011]Digit |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.689 s |
提交时间 |
2016-03-30 09:17:32 |
内存使用 |
126.67 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<string>
#include<deque>
#include<cstring>
#include <sstream>
using namespace std;
const int MAXN=910;
int d,s1,s2;
int n;
class miku
{
public:
int s1,s2,r;
void print()
{
cout<<s1<<" "<<s2<<" "<<r<<endl;
}
};
deque<miku> Q;
int Len[MAXN*2][MAXN*2][10];//A的位数和为i,A*D除第n+1外位数和为j,A*D的第n+1位为k,A的最少位数
void prepare()
{
memset(Len,0x7F,sizeof(Len));
miku tem;
for(int i=0;i<10;i++)
{
tem.s1=i;
tem.s2=i*d%10;
tem.r=i*d/10;
Q.push_back(tem);
Len[tem.s1][tem.s2][tem.r]=1;
}
Len[0][0][0]=0;
while(!Q.empty())
{
miku S=Q.front();Q.pop_front();
for(int i=0;i<=9;i++)
{
tem.s1=S.s1+i;
tem.s2=S.s2+(S.r+i*d)%10;
tem.r=(S.r+i*d)/10;
//tem.print();
if(tem.s1>s1||tem.s2>s2) continue;
if(Len[tem.s1][tem.s2][tem.r]>Len[S.s1][S.s2][S.r]+1)
{
Len[tem.s1][tem.s2][tem.r]=Len[S.s1][S.s2][S.r]+1;
Q.push_back(tem);
}
}
}
}
void get(ostringstream &oss,int len,int S1,int S2,int R)
{
for(int i=0;i<len;i++)
{
bool ok=0;
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
int ns1=S1-j,ns2=S2-k;
int nr=R*10-j*d+k;
if(nr<0||nr>9) continue;
if(ns1<0||ns2<0)continue;
if(Len[ns1][ns2][nr]>len-i-1)continue;
S1=ns1,S2=ns2,R=nr;
//cout<<i<<endl;
oss<<j;
ok=1;
break;
}
if(ok==1) break;
}
if (ok==0)
{
for(int j=i;j<len;j++) oss<<"0";
return;
}
}
}
int getsum(int x)
{
int re=0;
while(x)
{
re+=x%10;
x/=10;
}
return re;
}
string ans;
void Calc(int i,ostringstream &tem)
{
string now=tem.str();
//cout<<now<<endl;
ostringstream tem2;
tem2<<i;
for(int u=0;u<n-now.length()-1;u++) tem2<<"0";
tem2<<now;
now=tem2.str();
if(now.size()<ans.size()||(now.size()==ans.size()&&now<ans)) ans=now;
}
void work()
{
ans="";
for(int i=0;i<=MAXN+1;i++) ans+="9";
//cout<<ans<<endl;
for(int i=1;i<=9;i++)//枚举首位,因为不能有前导0
{
int ns=s1-i;
if(ns<0) continue;
for(int j=0;j<=9;j++)
{
for(int k=0;k<=s2;k++)
{
if(Len[ns][k][j]>n-1) continue;
if(k+getsum(j+i*d)==s2)
{
ostringstream tem;
//cout<<ns<<" "<<k<<" "<<j<<" "<<Len[ns][k][j]<<endl;
get(tem,n-1,ns,k,j);
Calc(i,tem);
}
if(Len[ns][k][j]<n-1&&k+j+getsum(i*d)==s2)
{
ostringstream tem;
//cout<<ns<<" "<<k<<" "<<j<<" "<<Len[ns][k][j]<<endl;
get(tem,Len[ns][k][j],ns,k,j);
Calc(i,tem);
}
}
}
}
if(ans.size()>MAXN) printf("-1\n");
else cout<<ans<<endl;
}
int main()
{
freopen("nt2011_digit.in","r",stdin);
freopen("nt2011_digit.out","w",stdout);
scanf("%d%d%d%d",&n,&s1,&s2,&d);
prepare();
work();
//cout<<Len[9][9][0]<<endl;
return 0;
}