计蒜客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 1000N1000,T \le 1000T1000;

对于 40\%40% 的数据:N\le 100000N100000,T \le 5T5;

对于 60\%60% 的数据:N \le 100000N100000,T \le 5000T5000;

对于 100\%100% 的数据:N\le 10^{18}N1018​​,T \le 50000T50000。

忽略每行输出的末尾多余空格

样例输入

3
216
121
2005

样例输出

198
Stupid SiriusRen
1979
显然,选择的数x必须满足
n-9*18<=x<=n
那么只要在这个范围枚举x,在计算每一位的和,加起来
取一个最小的x
 1 #include
 2 #include
 3 #include
 4 #include
 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 }

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/7706291.html

你可能感兴趣的:(计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi)