int g[T][T], fac[M][3]; bitset<M> vis; vector<int> pri; voidprework(){ vis[0] = vis[1] = true; fac[1][0] = fac[1][1] = fac[1][2] = 1; for (int i = 2; i < M; ++i) { if (!vis[i]) { fac[i][0] = fac[i][1] = 1; fac[i][2] = i; pri.push_back(i); } for (int j : pri) { int mul = i * j; vis[mul] = true; fac[mul][0] = fac[i][0] * j; fac[mul][1] = fac[i][1]; fac[mul][2] = fac[i][2]; sort(fac[mul], fac[mul] + 3); if (i % j == 0) break; } } for (int i = 0; i < T; ++i) g[0][i] = g[i][0] = i; for (int i = 1; i < T; ++i) for (int j = 1; j <= i; ++j) g[i][j] = g[j][i] = g[j][i % j]; } intgcd(int a, int b){ int ans = 1; for (int i = 0; i < 3; ++i) { int _ = fac[a][i] > T ? (b % fac[a][i] ? 1 : fac[a][i]) : g[fac[a][i]][b % fac[a][i]]; b /= _; ans *= _; } return ans; }
更相减损术
小常数 。
若 ,
若 ,。
若 (反之同理),。
若以上均不满足,设 ,则 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
intgcd(int a, int b){ int i = __builtin_ctz(a); int j = __builtin_ctz(b); int k = min(i, j); int d; b >>= j; while (a) { a >>= i; d = b - a; i = __builtin_ctz(d); if (a < b) b = a; if (d < 0) a = -d; else a = d; } return b << k; }