模幂算法

//
//712的n次方,结果后三位为696,满足这个条件的n的个数为多少?(0  < n < 24767)
//这是一个典型的模幂算法问题,下面证明 : (a * b) % n = [(a % n) * (b % n)] % n  (把*换成 + 也成立)
// 设 a = k1*n + r1, b = k2*n + r2,
// 于是有 :
//(a * b) % n = (k1*k2*n*n + k1 * r2 * n + k2 * r1 * n + r1 * r2) % n = (r1 * r2) % n = [(a % n) * (b % n)] % n.
//根据上面证明有(a^b) % n = ((a%n) * (a ^ (b - 1)) % n) % n          ==696;
//下面给出模幂运算的递归和非递归代码:
#include<iostream>
using namespace std;

int getMod1(int a, int b, int n) //712*712*712*712*712*712*712*712。。。。。 a^b%n
{
if (0 == b)
return 1;
return (a % n * getMod1(a, b - 1, n)) % n;
}

int getMod2(int a, int b, int n) // a:712 b:712的次方数 n:1000,模n后剩余后三位数字
{
int i, r = 1;
for (i = 1; i <= b; i++)
{
r = ((r % n) * (a % n)) % n;
}
return r;
}

int main()
{
int a = 3;
int b = 4;
int n = 5;
cout << getMod1(a, b, n) << endl; //81%5=1
cout << getMod2(a, b, n) << endl;

int i, r, sum = 0;
a = 712;
n = 1000;
r = 696;
for (i = 1; i < 24767; i++)
if (r == getMod2(a, i, n))
sum++;
cout << sum << endl;

return 0;
}

原文地址:https://www.cnblogs.com/xcb-1024day/p/11334804.html

时间: 2024-07-31 15:14:28

模幂算法的相关文章

hdu oj 1061 Rightmost Digit (快速幂算法)

这里首先要讲解一下快速幂算法: 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.[有读者反映在讲快速幂部分时有点含糊,所以在这里对本文进行了修改,作了更详细的补充,争取让更多的读者一目

快速乘法/快速幂 算法

快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩阵快速乘法 一.整数运算:(快速乘法.快速幂) 先说明一下基本的数学常识: (a*b) mod c == ( (a mod c) * (b mod c) ) mod c //这最后一个mod c 是为了保证结果不超过c 对于2进制,2n可用1后接n个0来表示.对于8进制,可用公式 i+3*j ==

【分治】快速模幂

问题 R: [分治]快速模幂 时间限制: 1 Sec  内存限制: 64 MB提交: 8  解决: 7[提交][状态][讨论版] 题目描述 试求ab%n的值,其中a.b.n均为整数范围内的数. 输入 三个整数a.b和n 输出 ab%n的值 样例输入 1 1 1 样例输出 0解题思路:快速模幂比快速幂多了取余,和另一个快速取余是一样的.有公式.代码: #include <iostream> #include <cstdio> using namespace std; //a*b %

求幂算法

1.简单递归 最简单的求幂算法是根据xn=x*xn-1,使用递归: def foo(x,n): if n==0: return 1 else: return x*foo(x,n-1) 这样求x的n次方,会进行n-1次乘法运算,n较大时效率很低. 2.高效递归 一种更高效的算法,可以将运算次数降到LogN的级别,由于: xn=xn/2*xn/2 , n为偶数时 xn=x(n-1)/2*x(n-1)/2*x , n为奇数时 def foo(x,n): if n==0: return 1 else:

更快的求整数幂算法

相信整数幂运算作为一个算法演变的例子是再合适不过的了为了节省访客们宝贵的学习时间省去介绍递归等可能涉及到的初级概念的定义.同时如果发现文中有错误的地方请敞开衣服指正. 因为在测试性能时合适的测试数据是必要的,所以本文用C++的大数类进行演示. 点击获取C++大数类源码 这里我们先列一下会提到的算法分析技术: 动态规划 减治法 测试平台: Linux g++ 4.7 原始递归方法 这就不花时间赘述什么了. BigInteger pow(BigInteger x, int N) { if (N ==

快速幂算法的理解

首先给出代码: #include <iostream> using namespace std; //计算a^bmodn int modexp(int a,int b,int n) { int ret=1; int tmp=a; while(b) { if(b&1) ret=ret*tmp%n; tmp=tmp*tmp%n; b>>=1; } return ret; } int main() { cout<<modexp(2,10,3)<<endl;

快速模幂

问题 H: [分治]快速模幂 时间限制: 1 Sec  内存限制: 64 MB提交: 79  解决: 64[提交] [状态] [讨论版] [命题人:admin] 题目描述 试求ab%n的值,其中a.b.n均为整数范围内的数. 输入 三个整数a.b和n 输出 ab%n的值 样例输入 1 1 1 样例输出 0 1 #include <iostream> 2 3 using namespace std; 4 typedef long long ll; 5 ll fun(ll a, ll b, ll

UVA11029 Leading and Trailing【快速模幂+数学】

Apart from the novice programmers, all others know that you can't exactly represent numbers raised to some high power. For example, the C function pow(125456, 455) can be represented in double data type format, but you won't get all the digits of the

银行卡号码的校验规则(Luhn算法/模10算法)

银行卡校验 可以用于前端需要用户输入银行卡时做初步校验 银行卡号码的校验采用Luhn算法,校验过程大致如下: 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3-. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回. 如果s能够整除10,则此号码有效,否则号码无效.