time limit per test
2 seconds
memory limit per test
256 megabytes
Vadim has thought of a number x. To ensure that no one can guess it, he appended a positive number of zeros to the right of it, thus obtaining a new number y. However, as a precaution, Vadim decided to spread the number n=x+y. Find all suitable x that Vadim could have thought of for the given n.
Input
Each test consists of several test cases. The first line contains a single integer t (1≤t≤104) --- the number of test cases. The following lines describe the test cases.
In a single line of each test case, there is an integer n --- the number spread by Vadim (11≤n≤1018).
Output
For each number n, output 0 if there are no suitable x. Otherwise, output the number of suitable x, followed by all suitable x in ascending order.
Example
Input
Copy
5
1111
12
55
999999999999999999
1000000000000000000
Output
Copy
2
11 101
0
1
5
3
999999999 999000999000999 90909090909090909
0
Note
In the first sample, to 11 one can append two zeros to the right, then 11+1100=1111, and to 101 one can append one zero to the right, then 101+1010=1111.
In the second sample, it is impossible to obtain 12 through the described actions.
解题说明:此题是一道数学题,给出一个N,是否能找出一个X,使得X+Y=N,其中Y = X ∗ 10 ^K,求解X+X ∗ 10 ^K=N。 因为N范围小于10^18次方,因此K最多为18.直接求解即可。
cpp
#include <stdio.h>
int main()
{
long long t;
scanf("%lld", &t);
while (t--)
{
long long n;
scanf("%lld", &n);
long long test = 1, testt[64];
int cnt = 0;
for (int k = 1; k <= 18; k++)
{
test *= 10;
long long d = test + 1;
if (n % d == 0)
{
testt[cnt++] = n / d;
}
}
if (cnt == 0)
{
printf("0\n");
continue;
}
printf("%d\n", cnt);
for (int i = cnt - 1; i >= 0; i--)
{
printf("%lld", testt[i]);
if (i)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}