题意:给定a,b,c,k四个变量,a代表等式A+B=C中数字a的长度,b和c同理,求满足条件的第k个等式,如不存在则输出-1即可。注意:满足条件的等式按字典序排序。
题解:首先我们可以想到按照暴力的解法,枚举出所有满足条件的等式,然后求出第k个等式,发现超时,那么优化为:根据A或B其中一个值和C的区间来求出B或A的区间,这样可以减少一层循环。
那么我们只需要枚举A的值,通过C的区间确定B的区间,这里B的区间只是一个可行解,但未必是满足条件的,故需要与给出的B的区间取交集,从而得到有多少个等式满足条件,直到满足条件的个数超过k(包括k)为止,这个时候可以推出第k个等式是什么。
代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<map>
#include<unordered_map>
#include<queue>
#include<stack>
#include<string>
#include<iomanip>
#define PII pair<int,int>
#define fi first
#define se second
#define ll long long
#define pb push_back
using namespace std;
const int inf=0x3f3f3f3f;
const int N=20000;
const int mod=1e9+7;
void solve()
{
int pre[8]={0,1,10,100,1000,10000,100000,1000000};
ll a,b,c,k;
cin >>a>>b>>c>>k;
ll sum=0;
ll la=pre[a],ra=pre[a+1]-1,lb=pre[b],rb=pre[b+1]-1,lc=pre[c],rc=pre[c+1]-1;
for(int i=la;i<=ra;i++)
{
ll l=max(lc-i,lb),r=min(rc-i,rb);
if(r-l+1>0)
{
if(r-l+1+sum>=k)
{
cout <<i<<" + "<<l+(k-sum-1)<<" = "<<i+l+(k-sum-1)<<endl;return ;
}
sum+=r-l+1;
}
}
cout <<-1<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t = 1;
cin >>t;
while(t--)
{
solve();
}
return 0;
}