每一个正整数都可以表示成m = An-1(n-1)! + An-2(n-2)! + An-3(n-3)! + ... + A1, (0<=Ai<=i, j =1, 2, ..., n-1)的形式. 但是对于一个给定的正整数, ACboy的老师要他找出最小的min(An-1 + An-2 + .. + A1)满足m = An-1(n-1)! + An-2(n-2)! + An-3(n-3)! + ... + A1.
你能帮帮他吗?
Input
输入首先给出一个N, 代表有N个测试实例。
接下来的N行, 每行包括一个正整数M (1 <= M < 2^32).
Output
对于每个测试实例输出min(An-1 + An-2 + .. + A1).
Sample Input
3 2 3 100
Sample Output
1
2
6
Hint
对于2, 可以写成2 = 1*2!, 所以答案为1.
对于3, 可以写成3 = 1*2! + 1*1!, 所以答案为2.
对于100, 可以写成100 = 4*4! + 2*2!, 所以答案为6.
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 18;
long long f[N], n;
int T;
int main()
{
for (int i = f[0] = 1; i < N; i++) f[i] = f[i - 1] * i;
for (scanf("%d", &T); T--; )
{
scanf("%lld", &n);
int cnt = 0;
for (int i = N - 1; i; i--)
{
while (n >= f[i]) n -= f[i], cnt++;
}
printf("%lld\n", cnt + n);
}
return 0;
}