为啥?
  • 板块P3861 拆分
  • 楼主Phrvth
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/23 13:16
  • 上次更新2023/11/23 17:36:17
查看原帖
为啥?
520544
Phrvth楼主2023/11/23 13:16
#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

2023/11/23 13:16
加载中...