codeforces1373E Sum of Digits

拖了很久才补的题,很巧妙的一道构造。
最优情况是类似x999c, c是个位,x不一定只是一位数。然后我们就进行枚举c和9的个数,注意在计算和的时候我们先不考虑x,因为最优情况x的末尾不是9,所以x在进位时,x并不会变化,也就是说剩余的价值一定得是x*(k+1)。此时我们得到一个x的数字和也就是题中的f(x), 然后再对x进行构造获得最小的x。x的结构一定是b999d,为了让x最小且符合最优情况d要尽可能大但又要小于9,也就是说如果剩下的价值可以让d等于8,d就是8,然后前面尽量排9,剩下的一位就是b了。

#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<math.h>
#include<climits>
#include<set>
#include<sstream>
#include<time.h>
#include<iomanip>
#include<bits/stdc++.h>

#define debug(x) cout <<#x<<" = "<<x<<endl
#define debug2(x, y) cout<<#x<<" = "<<x<<", "<<#y<<" = "<<y<<endl
#define gg cout <<"---------------QAQ---------------"<<endl
#define fi first
#define SZ(x) (int)x.size()
#define se second
#define pb push_back
#define MEM(a) memset(a, 0, sizeof(a))
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define PI cos(-1)
#define endl "\n"
#define eps 1e-8
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
template<class T> inline void read(T &x){
    x=0; char c=getchar(); int f=1;
    while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
    while (isdigit(c)) {x=x*10+c-'0'; c=getchar();} x*=f;
}
const int N = 3e5+10, maxn = 1e6+10;
//void FAST(){ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);}
const ll mod =  1e9+7;

int n, m, k;
ll ans;

void solve()
{
    ans = -1;
    scanf("%d%d", &n, &k);
    for(int c = 0; c <= 9; ++c)
    for(int d = 0; 9*d+c <= n; ++d)
    {
        int b = 0;
        for(int i = 0;i <= k; ++i)
            b += (i+c)%10+(i+c<10?9*d:1);
        b = n-b;
        if(b<0||b%(k+1)!=0) continue;
        int x = b/(k+1);
        ll v;
        if(x<8) v = x;
        else {
            x -= 8;
            v = x%9;
            for(int i = 0; i < x/9; ++i)
                v = 10*v+9;
            v = 10*v+8;
        }
        for(int i = 0;i < d; ++i)
            v = 10*v+9;
        v = 10*v+c;
        if(v<1e18&&(ans==-1||v<ans)) ans = v;
    }
    printf("%lld\n", ans);
}
int main(){
	int _; scanf("%d", &_); while(_--)
//    while(~scanf("%d", &n))
//    while(scanf("%d", &n)&&n)
	solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44070289/article/details/107229799