乘方快速幂 OR 乘法快速幂
关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了。
快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板:
__int64 mulpow(__int64 a,__int64 p,__int64 m)
{
__int64 ans = ;
while(p)
{
if(p&)
ans = ans * a % m;
p >>= ;
a = a * a % m;
}
return ans;
}
但是以上代码有个问题,并不适合m超过int的情况,下面提供m超过int情况的解法
__int64 multi(__int64 a,__int64 b,__int64 n) //乘法快速幂
{
__int64 temp=;
while(b)
{
if(b&)
{
temp+=a;
if(temp>=n) temp-=n;
}
a<<=;
if(a>=n) a-=n;
b>>=;
}
return temp;
} __int64 mulpow(__int64 a,__int64 m,__int64 n) //乘方快速幂
{
__int64 temp=;
a%=n;
while(m)
{
if(m&) temp=multi(temp,a,n);
a=multi(a,a,n);
m>>=;
}
return temp;
}
但缺点就是速度慢了点,logn*logn的,感谢南理工的《ACM算法训练教程》
poj3761
链接:http://poj.org/problem?id=3761
排列组合题目,但是真不好想,看了别人的题解才做出来的,orz别人的思维,是自己太弱了
题解:http://blog.csdn.net/cscj2010/article/details/7820906
这题典型的用快速乘方幂+快速乘法幂会TLE的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=;
__int64 a[maxn];
const int mod=;
__int64 mulpow(__int64 a,__int64 n,__int64 m)
{
__int64 temp=;
while(n)
{
if(n&) temp=temp*a%m;
a=a*a%m;
n>>=;
}
return temp;
}
int main()
{
__int64 n,k,T;
a[]=;
for(int i=;i<=maxn;i++)
a[i]=a[i-]*i%mod;
scanf("%I64d",&T);
while(T--)
{
scanf("%I64d%I64d",&n,&k);
printf("%I64d\n",(a[k]*((mulpow(k+,n-k,mod))-mulpow(k,n-k,mod)+mod)%mod)%mod);
}
return ;
}
乘方快速幂 OR 乘法快速幂的更多相关文章
- 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法
题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)
/* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...
- 51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )
1113 矩阵快速幂 链接:传送门 思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板. /******************************************************* ...
- 【BZOJ】2875: [Noi2012]随机数生成器(矩阵乘法+快速乘)
http://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵的话很容易看出来.....我就不写了.太水了. 然后乘法longlong会溢出...那么我 ...
- BZOJ2875 [Noi2012]随机数生成器 【矩阵乘法 + 快速乘】
题目 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me thod)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a, ...
- hdu 5187 高速幂高速乘法
http://acm.hdu.edu.cn/showproblem.php?pid=5187 Problem Description As one of the most powerful brush ...
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
- webpack快速入门——webpack3.X 快速上手一个Demo
1.进入根目录,建两个文件夹,分别为src和dist 1).src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块. 2).dist文件夹:用来存放 ...
随机推荐
- 第四届河南省省赛 走迷宫 二分+DFS
题目思路:使用二分查找路径中最大值和最小值之间的差值,从而确定出一组minn和maxn,对此组的minn和maxn经行DFS,如果可以找到一条路径,其中的最大值,最小值在minn~maxn的范围内,则 ...
- Java Interrupt Related
In Java, the main process can have several threads at a time, but only a few of them can run concurr ...
- Facade ——为子系统的一组接口提供一致界面
Façade模式提供了子系统一组接口的一致封装特性,如下图所示: 如图所示,OperationWrapper的实现依赖SubSystem1,2等的Operation操作.但用户调用OperationW ...
- libmysql.dll 找不到
在用C#开发的时候,需要连接MySQL ,系统提示 libmysql.dll 找不到模块. 我们可以找到 MySQL安装文件夹下的 C:\Program Files\MySQL\MySQL Ser ...
- 分布式数据库Cobar
Cobar简介: Cobar是关系型数据库的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务. 产品在阿里巴巴B2B公司已经稳定运行了3年以上. 目前已经接管了3000 ...
- IP地址、子网掩码详解
如何通过子网掩码划分网段 资料一: 一.缺省A.B.C类地址,子网掩码: 二.子网掩码的作用: code: IP地址 192.20.15.5 11000000 00010100 00001111 ...
- PAT1001
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B Calculate a + b and output the sum in standard format 计算a+b ...
- Yii config 配置
Yii2 配置文件 常用配置总结 <?php // 主配置文件 $config = array( 'modules' => array( 'gii' => array( 'class ...
- What is “Mock You” :Raise,callback,verify [转载]
http://www.cnblogs.com/wJiang/archive/2010/02/21/1670637.html Raise 如果你说会用Setup,那么Raise就更简单了.这里注意下它是 ...
- 简单的划分数问题<划分问题>
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 思路: 动态规 ...