定义

快速求a^b%c的算法

原理

指数可以被二进制分解

那么a^b可以分解为a^2^k1*a^2^k2*……

又显然a^2^(k+1)=a^(2^k*2)=(a^2^k)^2

所以可以将指数在二进制下从低位向高位递推,每次将底数平方,若该位是1就将答案乘上底数,直到指数为0。

实现时可以每次将指数/2方便处理

位运算优化

x&1:取x二进制下最后一位

x>>1:x/2

代码

int quickpow(int a,int b,const int c)
{
int base=a%c,ans=;
while(b)
{
if(b&)
ans=ans*base%c;
base=base*base%c;
b>>=;
}
return ans;
}

快速幂

例题

一、序列的第k个数

根据元素之差判断是不是等差数列,不是等差数列即为等比数列

推通项公式时注意序列起始为a

#include<cstdio>
#include<cctype>
using namespace std;
#define re register int
#define ll long long
int stk[],tt;
void print(ll x)
{
if(x==)
putchar('');
else
{
if(x<)
putchar('-'),x=-x;
tt=;
while(x)
{
stk[++tt]=x%;
x/=;
}
for(re i=tt;i;i--)
putchar(stk[i]|);
}
}
int read()
{
int x=,f=;
char c=getchar();
while(!isdigit(c))
{
f|=c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}
const int MOD=;
ll quickpow(int a,int b,const int c)
{
ll base=a%c,ans=;
while(b)
{
if(b&)
ans=ans*base%c;
base=base*base%c;
b>>=;
}
return ans;
}
int main()
{
int T=read();
ll a,b,c,k;
while(T--)
{
a=read(),b=read(),c=read(),k=read();
if(b-a==c-b)
print((a+(b-a)*(k-))%MOD);
else
print(a*quickpow(b/a,k-,MOD)%MOD);
putchar('\n');
}
return ;
}

序列的第k个数

二、[NOIP2013]转圈游戏

走10^k轮即移动m*10^k个位置,再加上x取模即可

#include<cstdio>
#include<cctype>
using namespace std;
#define re register int
#define ll long long
int stk[],tt;
void print(int x)
{
if(x==)
putchar('');
else
{
if(x<)
putchar('-'),x=-x;
tt=;
while(x)
{
stk[++tt]=x%;
x/=;
}
for(re i=tt;i;i--)
putchar(stk[i]|);
}
}
int read()
{
int x=,f=;
char c=getchar();
while(!isdigit(c))
{
f|=c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}
ll quickpow(int a,int b,const int c)
{
ll base=a%c,ans=;
while(b)
{
if(b&)
ans=ans*base%c;
base=base*base%c;
b>>=;
}
return ans;
}
int main()
{
int n=read(),m=read(),k=read(),x=read();
ll ans=(x+m*quickpow(,k,n))%n;
print(ans);
putchar('\n');
return ;
}

转圈游戏

三、[HNOI2008]越狱

可越狱方案数不好求,但从容斥原理的角度,答案可以表示成总排列数-不可越狱排列数

这两个数都很好求,总排列数=m^n,不可越狱排列数考虑第一个数有m种选法,后面每个数都只有m-1种选法,于是=m*(m-1)^(n-1)

#include<cstdio>
#include<cctype>
using namespace std;
#define re register int
#define ll long long
int stk[],tt;
void print(int x)
{
if(x==)
putchar('');
else
{
if(x<)
putchar('-'),x=-x;
tt=;
while(x)
{
stk[++tt]=x%;
x/=;
}
for(re i=tt;i;i--)
putchar(stk[i]|);
}
}
ll read()
{
ll x=;
int f=;
char c=getchar();
while(!isdigit(c))
{
f|=c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}
const int MOD=;
ll quickpow(int a,ll b)
{
ll base=a%MOD,ans=;
while(b)
{
if(b&)
ans=ans*base%MOD;
base=base*base%MOD;
b>>=;
}
return ans;
}
inline int mod(ll a)
{
a%=MOD;
if(a<)
a+=MOD;
return a;
}
int main()
{
ll m=read(),n=read();
print(mod(quickpow(m,n)-m*quickpow(m-,n-)));
putchar('\n');
return ;
}

越狱

注意事项

1、根据题目数据范围适当修改快速幂函数中数据的类型

2、取模的数可能<0时注意实际意义

快速幂(Fast Pow)的更多相关文章

  1. hdu 1757 矩阵快速幂 **

    一看正确率这么高,以为是水题可以爽一发,结果是没怎么用过的矩阵快速幂,233 题解链接:点我 #include<iostream> #include<cstring> ; us ...

  2. HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)

    传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...

  3. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律

    http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...

  5. LeetCode 50 - Pow(x, n) - [快速幂]

    实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10输出: 1024.00000 示例 2: 输入: 2.10000, 3输出: 9.26100 示例 ...

  6. LeetCode Pow(x, n) (快速幂)

    题意 Implement pow(x, n). 求X的N次方. 解法 用正常的办法来做是会超时的,因为可能有21亿次方的情况,所以需要优化一下.这里用到了快速幂算法,简单来说就是将指数分解成二进制的形 ...

  7. HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂

    题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...

  8. hdu4965 Fast Matrix Calculation 矩阵快速幂

    One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...

  9. HDU - 4965 Fast Matrix Calculation 【矩阵快速幂】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4965 题意 给出两个矩阵 一个A: n * k 一个B: k * n C = A * B M = (A ...

随机推荐

  1. apache-httpd2.4编译安装

    centos 6 编译安装httpd-2.4 centos6yum安装的apr版本已经不适用httpd-2.4版本了.所以,需要源码编译apr以及apr-util1. 下载源码:cd /usr/loc ...

  2. Python学习之==>常用字符串方法

    1.常用字符串方法 a = '\n 字 符 串 \n\n' b = a.strip() # 默认去掉字符串两边的空格和换行符 c = a.lstrip() # 默认去掉字符串左边的空格和换行符 d = ...

  3. Android Studio编译报错Could not reserve enough space for 2097152KB object heap解决方法

    环境变量中添加

  4. C++笔记(7)——一些模拟题:简单模拟、查找元素、图形输出、日期处理、进制转换、字符串处理

    以下内容基本来自<算法笔记>,作者为胡凡,建议直接买书看,我这里只是摘抄部分当笔记,不完整的. 简单模拟 就是一类"题目怎么说你就怎么做"的题目.这类题目不涉及算法,只 ...

  5. “AIIA”杯-国家电网-电力专业领域词汇挖掘

    十一之前一直在做“电力领域的词典构建”任务,今天也去聆听了前五支队伍的报告,现结合这段时间来的项目经历,写一下自己的若干心得. 电力领域的词典构建——方法1(非监督学习) 在电力领域词典构建心得1.0 ...

  6. Java IO NIO详细讲解

    1.IO Java IO概述 2.NIO Java NIO浅析

  7. TortoiseGit不用每次输入用户名和密码的方法

    TortoiseGit每次同步代码时,都会让输入用户名和密码,虽然安全,但是自己用有点麻烦. 怎么解决呢?废话不多说,直接上图: 1.设置—编辑本地.git/config 2.在本地.git/conf ...

  8. C++中的字符串类

    1,本文分析 C++ 中的字符串,C 语言中的字符串利用的是 C 语言中的字符数组,  在 C 语言中没有真正意义上的字符串,利用了字符数组表示了字符串,最初设  计 C 语言仅仅是为了开发 Unix ...

  9. Linux——临界段,信号量,互斥锁,自旋锁,原子操作

    一. linux为什么需要临界段,信号量,互斥锁,自旋锁,原子操作? 1.1. linux内核后期版本是支持多核CPU以及抢占式调度.这里就存在一个并发,竞争状态(简称竟态). 1.2. 竞态条件 发 ...

  10. logstash启动时找不到自定义的JAVA_HOME环境变量

    logstash java 版本问题 配置logstash收集应用日志时出现报错,说是找不到JAVA_HOME环境变量,但是明明已经设置了 logstash要求java 1.8以上,查看生产环境: [ ...