`

高次幂取模的应用

阅读更多
此题乃师兄[ TT_last ]原创题!Orz膜拜一下

a simple problem

Problem Description
As we know , to caculate the sum ofis hard if the n is large,because today is Valentines Day,to make this problem more easy ,you only need to caculate the sum mod c

Input
There are multiply testcases. Each testcase, there is one line contains two integers n,c;(1<=n <= 10^1000000,1<=c <=1000000000

Output
For each testcase, output an integer, denotes the result of the sum mod c

Sample Input
2 4
3 5

Sample Output
0
2

Author
TT_last


计算这个的公式: n*2^(n-1)

高次取模降幂公式:

Phi是欧拉函数


#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
//#include <map>
#include <queue>
#include <utility>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <ctype.h>
using namespace std;
#define L long long
#define inf 0x3fffffff

char s[2000005];

L qmod (L a, L b, L c)    //快速幂取模
{
	L k = 0, i, d[40], res = 1;
	while (b)
		d[k++] = b % 2, b >>= 1;
	for (i = k - 1; i >= 0; i--)
	{
		res = res * res % c;
		if (d[i] == 1)
			res = res * a % c;
	}
	return res;
}

L Euler (L n)    //求欧拉函数值
{
	L i, res = n;
	for (i = 2; i * i <= n; i++)
	{
		if (n % i == 0)
		{
			n /= i, res = res - res/i;
			while (n % i == 0)
				n /= i;
		}
	}
	if (n > 1)
		res = res - res/n;
	return res;
}

int main()
{
	L tp, c, len, n, k1, k2, i, phi, res;
	while (~scanf ("%s%lld", s, &c))
	{
		len = strlen (s);
		tp = 0;
		for (i = 0; i < len; i++)
		{
			tp *= 10;
			tp += s[i] - '0';
			if (tp >= c)
				tp %= c;
		}
		k1 = tp;    //k1是n%c
		i = 1;
		while (s[len-i] == '0')    //n变成n-1
			s[len-i] = '9', i++;
		s[len-i]--;
		phi = Euler (c);
		n = -1;
		if (len < 11)
			sscanf (s, "%lld", &n);
		if (n == -1 || n >= phi)    //用降幂公式的条件
		{
			tp = 0;
			for (i = 0; i < len; i++)
			{
				tp *= 10;
				tp += s[i] - '0';
				if (tp >= phi)
					tp %= phi;
			}
			tp += phi;
		}
		else tp = n;
		k2 = qmod (2, tp, c);    //k2是2^(n-1)%c,其中n-1已降幂
		res = k1 * k2 % c;    //相当于(n%c*2^(n-1)%c)%c
		printf ("%lld\n", res);
	}
    return 0;
}
  • 大小: 8.2 KB
  • 大小: 3.3 KB
1
7
分享到:
评论
2 楼 基德KID.1412 2011-08-08  
sgeteternal 写道
原来有高次降幂!甘样确实唔会超时鸟 爽!

1 楼 sgeteternal 2011-08-08  
原来有高次降幂!甘样确实唔会超时鸟 爽!

相关推荐

    快速幂取模,大数幂次求模,a^p%m

    在计算机科学与数学领域中,快速幂取模(也称作模幂运算)是一种非常实用且高效的算法,广泛应用于密码学、信息安全以及高性能计算等领域。对于大整数的幂次运算与取模操作,传统的逐个相乘的方法效率低下,不适用于...

    C语言快速幂取模算法小结

    快速幂取模算法在程序设计竞赛和数学建模中被广泛应用,如计算大整数的阶乘、求解斐波那契数列、矩阵快速幂等。理解并掌握快速幂取模算法能够显著提高处理这类问题的效率,对于参加算法竞赛或解决相关问题的程序员来...

    C++快速幂与大数取模算法示例

    快速幂在计算幂次时大大减少了乘法次数,尤其在处理高次幂时,效率比直接乘法要高得多。大数取模则使得大整数加法可以在模`p`的范围内进行,避免了整数溢出的问题。这两种算法在解决数论问题、加密算法(如RSA)、...

    易语言大数幂模运算

    这种算法通过将指数二进制化,将一次乘方运算转化为多次平方和乘法运算,大大减少了计算复杂度。 模运算则是取余运算,如计算a除以b的余数,通常表示为a % b。在大数幂模运算中,我们不是简单地计算出大数乘方的...

    任意大整数的任意次幂

    总的来说,"任意大整数的任意次幂"的C语言实现是一个深入理解和运用算法的好例子,它展示了如何高效地处理大整数并进行高次幂运算,这对于编程技能的提升和问题解决能力的培养具有重要意义。学习这个程序可以帮助...

    大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制运算.zip

    大数运算处理的是超出普通整型数据类型范围的数值,通常涉及的运算包括加法、减法、乘法、除法、取模以及幂运算和模幂运算。在给定的"大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制...

    速幂算法C语言版(超详细).

    快速幂算法是指快速计算幂式的余数,即快速幂取模算法。它的主要应用场景是在程序设计过程中,需要快速计算大数的余数,以提高计算效率。 知识点2:快速幂算法的原始实现 原始的快速幂算法可以用以下公式表示:ans ...

    求幂的高精度算法

    在计算机科学中,当涉及到大整数运算时,如求幂,普通的整数类型(如int或long long int)往往无法满足需求,因为它们有固定的位宽限制。...这种方法在实际应用中更为常见,特别是在需要频繁计算幂的情况下。

    快速幂及其相关知识

    快速幂算法及其变体如快速幂取模,在现代计算科学中扮演着重要角色,尤其是在处理大数据集和高性能计算需求的场合下。通过合理利用二进制特性及同余定理,快速幂能够有效降低运算次数,提高计算效率。无论是理论研究...

    快速幂算法案例.rar

    快速幂算法,也被称为快速幂取模或Exponentiation by Squaring,是一种高效的计算大整数幂的方法,尤其在处理模运算时更为显著。在计算机科学和算法设计中,快速幂算法是解决“求a的b次方对c取模”的问题时的一种...

    组合数学- 组合数取模.rar

    通过不断平方和取模,可以高效地计算出高次幂的值。在计算组合数取模时,可以先利用快速幂计算阶乘的模p值,然后进行相应的除法操作。 在处理组合数取模问题时,还需注意模算术的一些基本性质,如中国剩余定理、同...

    快速幂+相关知识点.docx

    4. **快速求幂取模**:在实际应用中,往往需要对结果进行取模操作,以避免溢出。该方法利用了“积的取余等于取余的积取余”这一性质。 ```c int pow(int a, int n, int b) { int result = 1; a = a % b; while ...

    简单幂模源代码算法(容易看懂)

    总的来说,幂模运算在密码学和其他领域中具有广泛的应用,而高效的幂模运算算法,如蒙格马利快速幂模运算,是这些应用的基础。通过理解和实现这样的算法,我们可以更好地理解并优化计算过程,提高计算效率。

    Rabin-Miller快速素数测试

    在提供的文件列表中,"Rabin-Miller.h"可能包含了Rabin-Miller素数测试的函数声明和定义,"modexp.h"可能实现了快速幂取模的蒙格马利乘法算法,而"bool.h"可能是包含布尔类型定义和相关操作的头文件。这些文件共同...

    快速幂详解.md 快速幂算法是一种高效的计算幂运算的算法

    快速幂 快速幂算法是一种高效的计算幂运算的算法,它通过将指数进行二进制拆分,并利用指数的二...此外,在实际应用中,还需要注意处理底数为0或指数为0的特殊情况,以及考虑取模运算的需求,以满足不同的应用场景。

    取模运算和取余运算.pdf

    这个关系在诸如判断奇偶性、素数测试、模幂运算、最大公约数计算等领域都有广泛的应用。例如,如果a ≡ b (mod p)且p是素数,那么a^p ≡ a (mod p),这是费马小定理的一个基础。 此外,模运算具有以下基本性质: 1....

    多重幂问题

    虽然这种方法简单,但效率不如快速幂高。 4. **模运算优化**:如果问题涉及模运算,例如求`a^(b^c) mod m`,可以使用模幂运算进一步提高效率。每次计算后对模数`m`取模,避免了中间结果过大。 5. **动态规划**:在...

    矩阵快速幂_矩阵快速幂_

    2. **矩阵的快速幂分解**:将一个大幂次n表示为2的幂次的和,例如n = 2^k + r,然后通过以下步骤计算A^n: - 先计算A^2,然后用这个结果快速计算A^(2^2),A^(2^3),等等,直到2的幂次足够大,可以覆盖n的一部分。 ...

    基于QT(C++)实现(图形界面)应用密码学大作业【100010263】

    详情介绍:https://www.yuque.com/sxbn/ks/100010263 在本次大作业中,实现了如下基本算法: 加、减、乘、除、移位、幂取模的高精度算法 利用快速幂和牛顿迭代法加速取模运算 中国剩余定理 Miller Rabin检测

    一文彻底搞懂快速幂(原理实现、矩阵快速幂).pdf

    在实际应用中,快速幂通常用于求解模幂运算,即计算 `a^n mod m`。在这种情况下,每次乘法之后都要取模,以确保结果始终在模数范围内。 矩阵快速幂是快速幂的一种扩展,它不仅适用于整数的幂运算,还可以用于矩阵的...

Global site tag (gtag.js) - Google Analytics