专栏文章
题解:CF1373E Sum of Digits
CF1373E题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioipbm0
- 此快照首次捕获于
- 2025/12/02 19:51 3 个月前
- 此快照最后确认于
- 2025/12/02 19:51 3 个月前
约定
本文约定 运算符表示将若干个整数依次拼接。
例如 。
例如 。
显然有 。
方法
因为 ,所以 在进位的时候至多进一位。
再观察样例,就不难想出将答案表示成这样。
再观察样例,就不难想出将答案表示成这样。
其中, 是一个末尾不为 的数字, 是一个一位数字。
因为 和 都非常小,所以我们枚举所有的 与 ,然后求出最小的 。
做法
我们把 分成两块研究,一块是最后一位进位之前,一块是进位后。
有的时候可能不会进位,也就没有第二块。
有的时候可能不会进位,也就没有第二块。
第一块大小表示 要加多少才能进位,也就是 。
因为总共有 个数,第一块已经有了 个,所以第二块就是 个。
因为总共有 个数,第一块已经有了 个,所以第二块就是 个。
要注意的事是:
1.总共有 个数,所以两块长度都不能超过 。
2.块长非负。
1.总共有 个数,所以两块长度都不能超过 。
2.块长非负。
记两块长度为:
那么 就应该长这样:
对上面所有数进行 函数的操作。
可以得到:
可以得到:
答案计算
在已知 后,为了让 尽可能小,就尽可能填入 ,但末尾不能是 所以填入 。
如果 那么 。
否则填入 后尽可能填入 ,形如 。
其中 是 减掉 再模 得到的数。
否则填入 后尽可能填入 ,形如 。
其中 是 减掉 再模 得到的数。
得出这次对应得答案为 。
所有答案取 即为答案。
所有答案取 即为答案。
代码
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=9e18;
void add(ll &a,ll b){// 拼接函数,将 a 拼上 b
for(ll b1=b;b1;b1/=10)a*=10;
a+=b;
}
ll construct(int fp,int t,int r){// 输入 f(p),t,r 返回最小的 x
ll fr=0;
if(fp<=8)add(fr,fp);
else{
fp-=8;// 末尾会填入 8
if(fp%9)add(fr,fp%9);
for(;fp>=9;fp-=9)add(fr,9);// 尽可能用 9
add(fr,8);// 末尾一个 8,因为 p 的末尾不能是 9
}
while(t--)add(fr,9);
if(r)add(fr,r); else fr*=10;//我的拼接函数拼不上 0
return fr;
}
ll solve(){
ll n,k;
cin>>n>>k;
ll ans=INF;
ll A,B;
for(int t=0;t<=18;t++){
for(int r=0;r<=9;r++){
A=10-r; B=(k+1)-(10-r);
A=min(A,k+1); B=max(B,0LL); //块长限制
ll D=n-B-9*A*t-A*r-(A*(A-1)+B*(B-1))/2;
if(D<0 || D%(k+1))continue;
ll fp=D/(k+1);
ans=min(ans,construct(fp,t,r));
}
}
if(ans>=INF)return -1;
return ans;
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
int T; cin>>T;
while(T--)cout<<solve()<<'\n';
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...