Educational Codeforces Round 90 (Rated for Div. 2)E. Sum of Digits(数论+思维)

如果要让答案最小,显然我们是希望不进位的,因为一旦进位,会让对答案的贡献减少9*进位次数(这样明显会让答案变大).所以我们优先考虑不进位的。其实只要(n-(1+k)*k/2)%(k+1)即可。
((1+k)*k/2)是后面k个数个位上比答案大的差值。
那如果不满足就要考虑是否存在进位情况产生了,
为了让答案最小,结论是:每个数最多只进一次位。
那么如果答案是两位数以上,让十位最大为8即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 2000005
#define rep(n) for(int i=1;i<=n;i++)
#define rall(x) for(int i=(x).size()-1;i>=0;i--)
#define all(x) for(int i=0;i<(x).size();i++)
int a[MAXN];
int b[MAXN];
int pos[MAXN];
const long long mod=1000000007;
int solve(ll x,ll k)
{
    if(x<0||x%(k+1)!=0)
        return -1;
    if(x==0)
    {
        cout<<"0"<<endl;
        return 1;
    }
    x/=k+1;
    vector<int>out;
    if(x>=9-k) {
        out.push_back(9 - k);
        x-=9-k;
        if(x>=9)
            for(int i=1;i<=x/9;i++)
                out.push_back(9);
        x%=9;
        if(x)out.push_back(x);
        for(int i=out.size()-1;i>=0;i--)
            printf("%d",out[i]);
        printf("\n");
        return 1;
    }
    else
    {
        printf("%lld\n",x);
        return 1;
    }
}
int solve_(ll x,ll tail)
{
    if(x<0)return -1;
    vector<int>out;
    out.push_back(tail);
    if(x<=8) {
        if(x)
            out.push_back(x);
        for(int i=out.size()-1;i>=0;i--)
            printf("%d",out[i]);
        printf("\n");
    }
    else
    {
        out.push_back(8);
        x-=8;
        if(x)
            for(int i=1;i<=x/9;i++)
                out.push_back(9);
        if(x%9)
            out.push_back(x%9);
        for(int i=out.size()-1;i>=0;i--)
            printf("%d",out[i]);
        printf("\n");

    }
    return 0;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,k;
        scanf("%lld%lld",&n,&k);
        if(solve(n-(1+k)*k/2,k)==-1)
            for(ll i=10-k;i<=9;i++)
            {
                ll del=(i+9)*(9-i+1)/2+(k-10+i)*(k-9+i)/2+(k-9+i);
                if((n-del)%(k+1)==0&&solve_((n - del) / (k + 1), i)!=-1)
                    break;
                if(i==9)cout<<"-1"<<endl;
            }
    }
}

你可能感兴趣的:(CF)