题目链接
思路:
预处理每一位的10次方,从最末尾开始逐位上升,累计操作数,每次上升之前都计算所有位之和,如果满足条件直接break,否则继续进一升位(防止999999情况出现),输出操作数即可。
代码:
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define pb push_back
#define ll long long
const int N=2e5+5;
const int M=2e4+5;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926;
using namespace std;
int p10[20],a[20];
char str[22];
int cal(int n)
{
int sum=0;
for(int i=1;i<=n;i++)
sum+=a[i];
return sum;
}
signed main(void)
{
IOS;
int t;
cin>>t;
p10[1]=1;
for(int i=2;i<=20;i++)
{
p10[i]=p10[i-1]*10;
}
while(t--)
{
memset(a,0,sizeof(a));
memset(str,0,sizeof(str));
int s;
cin>>str+1>>s;
int n=strlen(str+1);
for(int i=1;i<=n;i++)
{
a[n-i+1]=str[i]-'0';
}
int ans=0,sum=cal(n);
if(sum<=s)
{
cout<<0<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
ans+=(10-a[i])*p10[i];
a[i]=0;
a[i+1]++;
if(cal(n)<=s)
break;
}
cout<<ans<<endl;
}
}
return 0;
}