关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于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 乘法快速幂的更多相关文章

  1. 【bzoj4870】[Shoi2017]组合数问题 dp+快速幂/矩阵乘法

    题目描述 输入 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ r < k ≤ 50, 2 ≤ p ≤ 2^30 − 1 输出 一行一个整数 ...

  2. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  3. Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)

    /* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...

  4. 51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )

    1113 矩阵快速幂 链接:传送门 思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板. /******************************************************* ...

  5. 【BZOJ】2875: [Noi2012]随机数生成器(矩阵乘法+快速乘)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵的话很容易看出来.....我就不写了.太水了. 然后乘法longlong会溢出...那么我 ...

  6. BZOJ2875 [Noi2012]随机数生成器 【矩阵乘法 + 快速乘】

    题目 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me thod)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a, ...

  7. hdu 5187 高速幂高速乘法

    http://acm.hdu.edu.cn/showproblem.php?pid=5187 Problem Description As one of the most powerful brush ...

  8. 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

  9. webpack快速入门——webpack3.X 快速上手一个Demo

    1.进入根目录,建两个文件夹,分别为src和dist 1).src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块. 2).dist文件夹:用来存放 ...

随机推荐

  1. Tomcat服务器

    常见的web服务器 1. WebLogic是BEA公司的产品,是目前应用最广泛的web服务器,支持J2EE规范(J2EE里有13种技术),商业产品,收费的.银行,证券等对并发,安全要求高的时候用,一般 ...

  2. php如何获取本地手机号

    <?php function inquiry_number_infor($phonenumber) /* *传入手机号码,通过API的到xml格式数据,对xml进一步解析,最后返回相应的号码信息 ...

  3. Struts2龙之总结

    一.Struts2执行流程: 1.客户端初始化一个指向servlet容器(tomcat)的请求: 2.这个请求经过一系列过滤器(Filter): 3.接着StrutsPrepareAndExecute ...

  4. map.entry<k,v>小用法(转)

    你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息.标准的Map访问方法如下: Set keys = map.keySet( ...

  5. android activity四种启动模式

    1.standard <activity android:name=".MainActivity" android:launchMode="standard&quo ...

  6. github 教程

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

  7. winxp iis5中修改最大连接数及添加多个站点

    winxp iis5中修改最大连接数及添加多个站点 最 近用asp做一些东西,需要用到iis,还需要用photoshop做一些图片.以前都是在win2003下面做,可是photoshop里面很多中文字 ...

  8. VI中的批量替换 (转载)

      1) 文件内全部替换:   :%s#abc#123#g (如文件内有#,可用/替换,:%s/abc/123/g)   --注:把abc替换成123   (或者: %s/str1/str2/g 用s ...

  9. Left/Right/Inner Join用法和区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  10. PS2鼠标+LCD12864实验——终于OK 了

    抱着“不气馁.不放弃.誓不罢休.搞不定你我还能搞其他玩意吗”的心态,调试许久的PS2鼠标实验,终于在今天被我搞定了.发几张图显摆一下,嘿嘿...    左键按下+鼠标移动 右键按下+鼠标移动  中键按 ...