Codeforces 1373 E Sum of Digits —— 思维,暴力

This way

题意:

在这里插入图片描述

题解:

好久没做22的题目现在变得这么难了吗?也可能是我变菜了,居然用了半个多小时
首先k<=9,所以最多只进一位,那么答案就有可能是这个样子的:
Codeforces 1373 E Sum of Digits —— 思维,暴力_第1张图片
或者是这样子的
Codeforces 1373 E Sum of Digits —— 思维,暴力_第2张图片
又或者
在这里插入图片描述
那么暴力的枚举减9的倍数的起点和9的个数,然后由于确定了-9的起点也就是确定了x的个位,确定了9的倍数的个数也就是确定了在第j+1位一定是<=8。

#include
using namespace std;
#define ll long long
ll deal(int x,int ge,int h){//个位数必须是ge,高度=h+1时必须不是9
    x-=ge;
    h--;
    ll ret=ge;
    while(x-9>=0&&h--)
        ret=ret*10+9,x-=9;
    if(x-8>=0)
        ret=ret*10+8,x-=8;
    while(x-9>=0)
        ret=ret*10+9,x-=9;
    if(x)
        ret=ret*10+x;
    ll ans=0;
    while(ret)
        ans=ans*10+ret%10,ret/=10;
    if(ge==0)
        ans=ans*10;
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,k;
        scanf("%d%d",&n,&k);
        k++;
        int x;
        ll ans=1e18;
        if((n-k*(k-1)/2)%k==0){
            x=(n-k*(k-1)/2)/k;
            for(int i=0;i<=9&&i<=x&&i<=10-k;i++)
                ans=min(ans,deal(x,i,100));
        }
        else{
            for(int i=2;i<=k;i++){
                for(int j=1;j<=15;j++){
                    if((n+(k-i+1)*j*9-(k-1)*k/2)%k==0){
                        x=(n+(k-i+1)*j*9-(k-1)*k/2)/k;
                        if(1+9*j<=i-1+x)
                            ans=min(ans,deal(x,10-i+1,j));
                    }
                }
            }
        }
        printf("%lld\n",ans<1e18?ans:-1);
    }
    return 0;
}

你可能感兴趣的:(想法)