#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 7, MAXD = 6727;
typedef long long ll;
const ll Mod = 998244353;
int T;
ll n, m, sqrtn;
ll Pos[MAXN][2], D[MAXN], F[MAXD][MAXD];
int main () {
ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> T;
while (T --) {
cin >> n; m = 0; sqrtn = (int)sqrt(n);
for (ll i = 1; i * i <= n; i ++)
if (n % i == 0) {
D[++ m] = i;
if (i * i != n) D[++ m] = n / i;
}
sort(D + 1, D + 1 + m);
memset(Pos, 0, sizeof(Pos)); memset(F, 0, sizeof(F));
for (int i = 1; 2 * i <= m + 1; i ++)
Pos[D[i]][0] = i, Pos[D[i]][1] = m - i + 1;
for (int i = 1; i <= m; i ++) F[i][1] = (i == 1 ? 1 : 0);
for (int i = 1; i <= m; i ++)
for (int j = 2; j <= m; j ++) {
F[i][j] = F[i][j - 1];
if (j <= i && D[i] % D[j] == 0) {
int tmp = D[i] / D[j], pos = (tmp <= sqrtn ? Pos[tmp][0] : Pos[n / tmp][1]);
(F[i][j] += F[pos][j - 1]) %= Mod;
}
}
cout << F[m][m] - 1 << '\n';
}
return 0;
}
这份代码中
tmp <= sqrtn
是不是可以写成
tmp * tmp <= n
那为什么一个 30,一个 60
还有其他的问题吗?我真的看不出来了/kk