那年一个雨季,AmyZhi 在校门外弯身买参考书。
这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题:
---------------
给你一个数字 NN(NN 的范围是 11 ~ 10000001000000),求一个最小的正整数 MM,这个数字 MM 的各个位的数字加上它本身之和恰好为NN。
---------------
没有想到 AmyZhi 秒解了这道题并把 NN 扩大到了 10^{18}1018 甩回给了 SiriusRen。
SiriusRen 苦苦思索,发现并不会这道题。
可怜 SiriusRen 一世英名,在 AmyZhi 面前却宛如智障少年。
SiriusRen 抬头透过倾斜的雨丝,看向模糊的世界,车水马龙,穿流不息,人来人往,形色匆匆,刹那间惘然,竟不知去向何方......
输入格式
第一行一个整数 TT,表示有 TT 组数据。
接下来 TT 行,每行一个整数 NN。
输出格式
对于每组数据,输出 MM。
若无解,输出一行Stupid SiriusRen
。
数据范围
对于 20\%20% 的数据:N \le 1000N≤1000,T \le 1000T≤1000;
对于 40\%40% 的数据:N\le 100000N≤100000,T \le 5T≤5;
对于 60\%60% 的数据:N \le 100000N≤100000,T \le 5000T≤5000;
对于 100\%100% 的数据:N\le 10^{18}N≤1018,T \le 50000T≤50000。
忽略每行输出的末尾多余空格
样例输入
3
216
121
2005
样例输出
198
Stupid SiriusRen
1979
显然,选择的数x必须满足
n-9*18<=x<=n
那么只要在这个范围枚举x,在计算每一位的和,加起来
取一个最小的x
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
lol ans,n;
int main()
{lol i,T;
cin>>T;
while (T--)
{
cin>>n;
ans=-;
for (i=n;i>=max(n-,(lol));i--)
{
lol x=i,cnt=;
while (x)
{
cnt+=x%;
x/=;
}
if (i+cnt==n) ans=i;
}
if (ans==-)
printf("Stupid SiriusRen\n");
else printf("%lld\n",ans);
}
}