输入
输出
分析
想复杂了啊啊。
还在推啥子的结论。。无语了。
原来就直接枚举就好了。
- 枚举位数相同的1~9合法数字,大于等于的第一个就是
- 枚举那一个不同的数字,枚举其他相同的数字,枚举不同的那个数字所在的位置。根据以上信息算出这个数,然后判断合法性,然后所有合法数字中取最小的。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
string s;
int k,a[20];
long long ans=1e17;
int main()
{
cin>>s;
cin>>k;
k=k+1;
int len=s.length();
long long shu=0;
for(int i=0;i<len;i++)
{
shu=shu*10+(s[i]-48);
}
if(k==1)
{
long long pan;
for(int i=1;i<=9;i++)
{
pan=0;
for(int j=1;j<=len;j++)
{
pan=pan*10+i;
}
if(pan>=shu)
{
cout<<pan;
break;
}
}
}
else
{
long long pan=0;
for(int i=0;i<=9;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=1;k<=len;k++)//这里从1开始
{
pan=0;
if(i==0&&k==1) continue;
for(int l=1;l<=k-1;l++)
{
pan=pan*10+j;
}
pan=pan*10+i;
for(int l=k+1;l<=len;l++)
{
pan=pan*10+j;
}
if(pan>=shu)
{
ans=min(ans,pan);
}
}
}
}
cout<<ans;
}
return 0;
}