Codeforces Round 880 (Div. 2):C. k-th equality

 链接:Codeforces Round 880 (Div. 2):C. k-th equality

题意:给定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;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,根据提供的引用内容,我无法理解你具体想要问什么问题。请提供更清晰明确的问题,我将竭诚为你解答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【CodeforcesCodeforces Round 865 (Div. 2) (补赛)](https://blog.csdn.net/t_mod/article/details/130104033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值