快速幂和逆元问题

当计算结果很大时对mod=1e9+7取余,用到同余定理。求2的幂直接暴力求(当然也可以快速幂)
求组合数的时候用到除法,又要取余,所以用到逆元。所以用到逆元公式。

1.什么是逆元

当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:

设c是b的逆元,则有b*c≡1(mod m);

则(a/b)%m = (a/b)*1%m = (a/b)*b*c%m = a*c(mod m);

即a/b的模等于 a*b的逆元 的模;

2.费马小定理求逆元

x^(mod-2)为x的逆元,所以 (a/b)%m = [a * (pow(b,mod-2)%mod)]% m;

但是mod=1e9+7,所以暴力求幂会超时,方法是用快速求幂法压缩时间.
//快速幂算法
long long fastpow(int a, unsigned int b)
{
long long int result = 1;
while(b != 0)
{
if(b & 1 == 1)
{
result *= a;
}
a *= a;
b >>= 1;
}
return result;
}

//求逆元算法
long long inv(long long x, int mod)
{
return fastpow(x, mod-2);
}

原文地址:https://www.cnblogs.com/khche/p/12496780.html

时间: 2024-10-25 11:08:22

快速幂和逆元问题的相关文章

数论——快速幂,模运算及快速幂求逆元

一.快速幂 原理: 快速幂的原理十分简单. ak=a2^0*a2^1*a2^2*…a2^x,其中k=20+21+22+…+2x. 这显然是正确的.因为任何一个数都可以表示成二进制. 接下去利用位运算实现即可. 代码实现 模板题链接:快速幂 代码模板如下:时间复杂度O(logk) int qmi(int a,int k,int p) { int res=1%p; while(k) { if(k&1)res=(long long)res*a%p; a=(long long)a*a%p; k>&g

NOIP2011多项式系数[快速幂|组合数|逆元]

题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m,每两个整数之间用一个空格隔开. 输出格式: 输出共1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取模后的结果. 输入输出样例 输入样例#1: 1 1 3 1 2 输出样例#1: 3 说明 [数据范围] 对于30% 的数据,有 0 ≤k ≤10 : 对于50% 的

hdu-4990 Reading comprehension(快速幂+乘法逆元)

题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem Description Read the program below carefully then answer the question.#pragma comment(linker, "/STACK:1024000000,1024000000"

Happy 2004(快速幂+乘法逆元)

Happy 2004 问题描述 : Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29). Take X = 1 for an example. The positive integer divisors of 2

hdu-5690 All X(快速幂+乘法逆元)

题目链接: All X Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据.每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤10^10 0≤c<k≤10,000 Ou

[HDOJ1492]Happy 2004(数论,快速幂,逆元,积性函数)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1452 题意:求2004^n的所有因子和. 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <

HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)

A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 865    Accepted Submission(s): 534 Problem Description There are an equation.∑0≤k1,k2,?km≤n∏1?j<m(kj+1kj)%1000000007=?We define

51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mod=1000000007; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c&

UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)

题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m 与后面的讨论分离.从m 种颜色中取出k 种颜色涂色,取色部分有C(m, k) 种情况: 然后通过尝试可以发现,第一个有k种选择,第二个因不能与第一个相同,只有(k-1) 种选择,第三个也只需与第二个不同,也有(k-1) 种选择.总的情况数为k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总