通过分析可以发现,x的值最大不会超过sqrt(n),最小也就是 n/x-s(n,m) ,同时 可以发现 s(x,m)的最大值为 81左右,不会太大,因此 x 的范围 在 sqrt(n)附近。。
#include <stdio.h> #include <math.h> #include <string.h> int get_bitsum(int n, int m) { int sum = 0; while (n) { sum += n % m; n /= m; } return sum; } int main() { int t; int m, n; long long N; scanf("%d", &t); while (t--) { scanf("%lld%d", &N, &m); int ans = -1; n = sqrt(N + 0.0); while (n) { if (N % n == 0) { int bitsum = get_bitsum(n, m); if (N / n - n == bitsum) { ans = n; } } if (N / n - n > 90) break; n--; } printf("%d\n", ans); } }