intphi(int x){ int res = x; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) x /= i; } } if (x > 1) res = res / x * (x - 1); //记得是 if(x > 1),不是 if(x) return res; }
给定 w1…n 和 p ,有 m 个询问区间 [l,r] ,求wlwl+1wl+2...wrmodp 的值
欧拉函数降幂
记住,不能这么写↓
1 2 3 4 5
intdfs(int l, int r, int p){ if (p <= 1) return0; if (l == r) return w[l] % p; returnpower(w[l], (dfs(l + 1, r, getphi(p)))+ getphi(p), p); //你不知道 dfs(l + 1, r) 是不是大于 $\varphi(p)$ }
求 abmodp 的时候要注意:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
intpower(int a, int b, int p){ int res = 1; while (b) { if (b & 1) { res = res * a; if (res >= p) res = res % p + p; //由于要做下一级的幂指数,所以要加上上一级的 $\varphi(p)$ ,即这一级 p 的值 } b >>= 1; a *= a; if (a >= p) a = a % p + p; } return res; }
intpower(int a, int b, int p){ int res = 1; if (a >= p) a = a % p + p;//取模,防止爆long long while (b) { if (b & 1) { res = res * a; if (res >= p) res = res % p + p; } b >>= 1; a *= a; if (a >= p) a = a % p + p; } return res; }