计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi
那年一个雨季,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
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long long lol; 7 lol ans,n; 8 int main() 9 {lol i,T; 10 cin>>T; 11 while (T--) 12 { 13 cin>>n; 14 ans=-1; 15 for (i=n;i>=max(n-165,(lol)0);i--) 16 { 17 lol x=i,cnt=0; 18 while (x) 19 { 20 cnt+=x%10; 21 x/=10; 22 } 23 if (i+cnt==n) ans=i; 24 } 25 if (ans==-1) 26 printf("Stupid SiriusRen\n"); 27 else printf("%lld\n",ans); 28 } 29 }