UVA 10692 - Huge Mods(数论)
2017-05-24 11:56
411 查看
UVA 10692 - Huge Mods
题目链接题意:求a0a1a2...mod m
思路:直接算肯定不行,利用欧拉定理ab=a(b mod phi(m) + phi(m))(b>=phi(m)),对指数进行降值处理。然后就能够利用高速幂去计算了,计算过程利用递归求解。
代码:
#include <stdio.h> #include <string.h> const int N = 1005; int phi[N * 10], vis[N * 10], m, n, a ; char M[15]; int pow_mod(int x, int k, int mod) { int now = 1; for (int i = 0; i < k; i++) { if (x == 1) break; now *= x; if (now >= mod) break; } if (now >= mod) now = mod; else now = 0; if (k == 0) return 1; int ans = pow_mod(x * x % mod, k>>1, mod); if (k&1) ans = ans * x % mod; return ans + now; } int dfs(int i, int mod) { if (i == n - 1) { if (a[i] >= mod) return a[i] % mod + mod; return a[i]; } int k = dfs(i + 1, phi[mod]); return pow_mod(a[i], k, mod); } int main() { for (int i = 1; i <= 10000; i++) phi[i] = i; for (int i = 2; i <= 10000; i++) { if (vis[i]) continue; for (int j = i; j <= 10000; j += i) { phi[j] = phi[j] / i * (i - 1); vis[j] = 1; } } int cas = 0; while (~scanf("%s", M) && M[0] != '#') { sscanf(M, "%d", &m); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); printf("Case #%d: %d\n", ++cas, dfs(0, m) % m); } return 0; }
相关文章推荐
- uva 10692 - Huge Mods(数论)
- UVA 10692 - Huge Mods(数论)
- uva 10692 - Huge Mods(数论)
- [UVA10692]Huge Mods
- uva 10692 - Huge Mods 指数循环节
- UVa10692,Huge Mod,数论,欧拉定理,指数循环节
- UVa 10692 - Huge Mods(指数循环节)
- UVA - 10692 Huge Mods (欧拉函数)
- uva 10692 - Huge Mods(指数循环节)
- UVa10692 Huge Mods
- uva 10692——Huge Mods
- UVa 10692 - Huge Mod (数论 + 欧拉定理扩展)
- UVa 10692 Huge Mods(快速幂)(欧拉定理)
- UVA10692:Huge Mods
- UVA10692:Huge Mods
- UVa 10692 Huge Mods (指数循环节)
- uva 10780Again Prime? No Time.(简单数论)
- UVA 10312 - Expression Bracketing(数论+Catalan数)
- uva 10622 - Perfect P-th Powers(数论)
- uva 11105 - Semi-prime H-numbers(数论)