为了迎接明天的考试,临阵抱佛脚一下下(
求单个欧拉函数值:
int euler_phi(int n) { int ans = n; for (int i = 2; i * i <= n; i++) if (n % i == 0) { ans = ans / i * (i - 1); while (n % i == 0) n /= i; } if (n > 1) ans = ans / n * (n - 1); return ans; }
线性求欧拉函数:
void pre() { memset(is_prime, 1, sizeof(is_prime)); int cnt = 0; is_prime[1] = 0; phi[1] = 1; for (int i = 2; i <= 5000000; i++) { if (is_prime[i]) { prime[++cnt] = i; phi[i] = i - 1; } for (int j = 1; j <= cnt && i * prime[j] <= 5000000; j++) { is_prime[i * prime[j]] = 0; if (i % prime[j]) phi[i * prime[j]] = phi[i] * phi[prime[j]]; else { phi[i * prime[j]] = phi[i] * prime[j]; break; } } } }
线性求逆元
inv[1] = 1; for (int i = 2; i <= n; ++i) { inv[i] = (long long)(p - p / i) * inv[p % i] % p; }
高精度计算
#include <cstdio> #include <cstring> static const int LEN = 1004; int a[LEN], b[LEN], c[LEN], d[LEN]; void clear(int a[]) { for (int i = 0; i < LEN; ++i) a[i] = 0; } void read(int a[]) { static char s[LEN + 1]; scanf("%s", s); clear(a); int len = strlen(s); for (int i = 0; i < len; ++i) a[len - i - 1] = s[i] - '0'; } void print(int a[]) { int i; for (i = LEN - 1; i >= 1; --i) if (a[i] != 0) break; for (; i >= 0; --i) putchar(a[i] + '0'); putchar('\n'); } void add(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] + b[i]; if (c[i] >= 10) { c[i + 1] += 1; c[i] -= 10; } } } void sub(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { c[i] += a[i] - b[i]; if (c[i] < 0) { c[i + 1] -= 1; c[i] += 10; } } } void mul(int a[], int b[], int c[]) { clear(c); for (int i = 0; i < LEN - 1; ++i) { for (int j = 0; j <= i; ++j) c[i] += a[j] * b[i - j]; if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } } inline bool greater_eq(int a[], int b[], int last_dg, int len) { if (a[last_dg + len] != 0) return true; for (int i = len - 1; i >= 0; --i) { if (a[last_dg + i] > b[i]) return true; if (a[last_dg + i] < b[i]) return false; } return true; } void div(int a[], int b[], int c[], int d[]) { clear(c); clear(d); int la, lb; for (la = LEN - 1; la > 0; --la) if (a[la - 1] != 0) break; for (lb = LEN - 1; lb > 0; --lb) if (b[lb - 1] != 0) break; if (lb == 0) { puts("> <"); return; } for (int i = 0; i < la; ++i) d[i] = a[i]; for (int i = la - lb; i >= 0; --i) { while (greater_eq(d, b, i, lb)) { for (int j = 0; j < lb; ++j) { d[i + j] -= b[j]; if (d[i + j] < 0) { d[i + j + 1] -= 1; d[i + j] += 10; } } c[i] += 1; } } } int main() { read(a); char op[4]; scanf("%s", op); read(b); switch (op[0]) { case '+': add(a, b, c); print(c); break; case '-': sub(a, b, c); print(c); break; case '*': mul(a, b, c); print(c); break; case '/': div(a, b, c, d); print(c); print(d); break; default: puts("> <"); } return 0; }