那年一个雨季, 在校门外弯身买参考书。
这时 走过来,一言不合甩给她一道“自认为”很难的题:给你一个数字 ( 的范围是 ),求一个最小的正整数 ,这个数字 的各个位的数字加上它本身之和恰好为 。
没有想到 秒解了这道题并把 大到了 甩回给了 。
苦苦思索,发现并不会这道题。
可怜 一世英名,在 面前却宛如智障少年。
题目是水题但是题面确实可以……
最常见的思路就是考虑从小到大枚举 ,直到找到满足条件的那一个。但是这枚举的范围显然太大,而实际上我们可以确定这个范围。
假设 的位数为 ,由于一个十进制数每位上的数字最大为 ,那么这个 加上它各个位上的和最大也就为 ,所以我们枚举的下边界就是 ,而实际上这样枚举的时间复杂度是可以承受的。
参考代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define SG string
#define DB double
#define LL long long
using namespace std;
LL T,N;
inline LL Read(){
LL X=0;char CH=getchar();bool F=0;
while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
return F?-X:X;
}
inline void Write(LL X){
if(X<0)X=-X,putchar('-');
if(X>9)Write(X/10);
putchar(X%10+48);
}
LL GetNum(LL X){
LL Num=0;
while(X!=0){
Num++;X/=10;
}
return Num;
}
LL GetSum(LL X){
LL Sum=0;
while(X!=0){
Sum+=X%10;X/=10;
}
return Sum;
}
int main(){
LL I,J,K;
T=Read();
while(T--){
N=Read();
LL Num=GetNum(N);
for(I=N-Num*9;I<=N;I++){
LL Sum=GetSum(I);
if(Sum+I==N){
Write(I);putchar('\n');break;
}
}
if(I==N+1){
puts("Stupid SiriusRen");
}
}
return 0;
}