UVA 10692 - Huge Mods(数论)

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[N];
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(数论),布布扣,bubuko.com

时间: 2024-12-25 10:43:57

UVA 10692 - Huge Mods(数论)的相关文章

uva 10692 Huge Mods 超大数取模

vjudge上题目链接:Huge Mods 附上截图: 题意不难理解,因为指数的范围太大,所以我就想是不是需要用求幂大法: AB % C = AB % phi(C) + phi(C) % C ( B > phi(C) ) 呢?后来发现确实需要用到,而且因为它有很多重指数,所以需要 dfs,深搜到最后一层后才返回,每次向上一层返回用求幂公式处理好的指数,然后本层用同样的原理去处理好当前层取模的值,并向上一层返回.欧拉函数预处理即可,这题的结束也有点卡人,我是用输入挂来处理的. 1 #include

UVa 10692 Huge Mods

方法:数论 其实不是很明白,为什么这个公式可行 a^b % m = a^(b%phi[m] + phi[m]) % m code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 #include <stack> 8

UVA - 10692 Huge Mods (欧拉函数)

Problem X Huge Mod Input: standard input Output: standard output Time Limit: 1 second The operator for exponentiation is different from the addition, subtraction, multiplication or division operators in the sense that the default associativity for ex

UVA 10692 Huge Mods(指数循环节)

指数循环节,由于a ^x = a ^(x % m + phi(m)) (mod m)仅在x >= phi(m)时成立,故应注意要判断 //by:Gavin http://www.cnblogs.com/IMGavin/ //指数循环节 递归处理 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include&l

UVA 10692 Huge Mod

Problem X Huge Mod Input: standard input Output: standard output Time Limit: 1 second The operator for exponentiation is different from the addition, subtraction, multiplication or division operators in the sense that the default associativity for ex

Uva 10629 Huge Mods (指数循环节)

题意:求 a1?a2?a3?. . .?aN mod m 思路:利用 和递归求解 代码: #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N=15; typedef long long ll; int MOD; int A[N],k; int phi(int n) { int rea = n; for(int i=2; i*i<=n;

uva 10560 - Minimum Weight(数论)

题目连接:uva 10560 - Minimum Weight 题目大意:给出n,问说至少需要多少个不同重量的砝码才能称量1~n德重量,给出所选的砝码重量,并且给出k,表示有k个重量需要用上述所选的砝码测量. 解题思路:重量为1的砝码肯定要选,它可以表示到1的重量,那么下一个砝码的重量肯定选择3(2?1+1),这样1,3分别可以用一个砝码表示,而2,4分别为3-1和3+1,这样1~4的重量也都可以表示.于是有公式ai=si?1?2+1. #include <cstdio> #include &

uva 11105 - Semi-prime H-numbers(数论)

题目链接:uva 11105 - Semi-prime H-numbers 题目大意:H-number为4?k+1(k为非负数),H-composites为因子中含有H-number(不包括自己本身)的数,反之久是H-prime,给定n,求有多少H-composites. 解题思路:首先用筛选法求出范围内的H-prime,然后枚举两个判断乘积是否在范围内. #include <cstdio> #include <cstring> const int maxn = 1e6+5; ty

UVA 11754 - Code Feat(数论)

UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题,分两种情况讨论 1.所有x之积较小时候,暴力枚举每个集合选哪个y,然后中国剩余定理求解 2.所有x之积较大时候,选定一个k/x尽可能小的序列,枚举x * t + y (t = 1, 2, 3...)去暴力求解. 代码: #include <stdio.h> #include <string.