二进制前置技能:https://www.cnblogs.com/AKMer/p/9698694.html

题目传送门:http://poj.org/problem?id=1995

题目就是求\(\sum_{i=1}^na[i]^{b[i]}mod\) \(m\)。我们只要会快速求\(a^b\)就行了。

我们可以用二进制拆分思想,把\(a^b\)转化成\(a^{(1010...1)_2}\)之类的。然后根据\(a^{x+y}=a^x*a^y\),我们可以将\(a^b\)转化成\(a^{(10000)_2}*a^{(100)_2}*a^{(1)_2}\)之类的形式。当二进制下这一位为\(1\),我们就把它累乘进答案里。

有因为\(a^{2x}=a^x*a^x\),所以对于每一位表示下\(a^{(100..)_2}\),我们可以通过上一位的平方得来。

所以二进制下有多少位,我们就进行多少次运算。

时间复杂度:\(O(nloga)\)

空间复杂度:\(O(1)\)

代码如下:

#include <cstdio>
using namespace std; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int quick(int x,int y,int m) {
int sum=1;
while(y) {
if(y&1)sum=1ll*sum*x%m;//如果y的二进制当前位置为1,就把x累乘进去
x=1ll*x*x%m;y>>=1;//否则x平方,y右移一位
}
return sum;
} int main() {
int Z=read();
while(Z--) {
int ans=0,m=read(),n=read();
for(int i=1;i<=n;i++) {
int x=read(),y=read();
ans=(ans+quick(x,y,m))%m;//累加求答案
}printf("%d\n",ans);
}
return 0;
}

POJ1995:Raising Modulo Numbers的更多相关文章

  1. POJ 1995:Raising Modulo Numbers 快速幂

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5532   Accepted: ...

  2. POJ1995 Raising Modulo Numbers(快速幂)

    POJ1995 Raising Modulo Numbers 计算(A1B1+A2B2+ ... +AHBH)mod M. 快速幂,套模板 /* * Created: 2016年03月30日 23时0 ...

  3. POJ1995 Raising Modulo Numbers

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6373   Accepted: ...

  4. poj1995 Raising Modulo Numbers【高速幂】

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5500   Accepted: ...

  5. POJ:1995-Raising Modulo Numbers(快速幂)

    Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9512 Accepted: 578 ...

  6. 【POJ - 1995】Raising Modulo Numbers(快速幂)

    -->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1  B1 A2  B2 A3  B3 ......... AH  ...

  7. poj 1995 Raising Modulo Numbers【快速幂】

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5477   Accepted: ...

  8. Raising Modulo Numbers(POJ 1995 快速幂)

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5934   Accepted: ...

  9. poj 1995 Raising Modulo Numbers 题解

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6347   Accepted: ...

随机推荐

  1. 电路分析三------KCL,KVL,VCR方程

    1.2b方程 2.举例 举例2

  2. 九度OJ 1333:考研海报 (区间操作)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:738 解决:299 题目描述: sun是万千考研学子中的一员,他每天过着三点一线的生活. 学校里有一个公告栏,他每天都看到上面张贴着各种考研 ...

  3. 九度OJ 1182:统计单词 (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3920 解决:1443 题目描述: 编一个程序,读入用户输入的,以"."结尾的一行文字,统计一共有多少个单词,并分别输出 ...

  4. Java 重写 equals 与 hashCode 的注意事项

    为什么重写 equals 的时候必须重写 hashCode 大家可能从很多教程中了解到: SUN官方的文档中规定"如果重定义equals方法,就必须重定义hashCode方法,以便用户可以将 ...

  5. JVM垃圾回收时的可触及性

    可触及的 1.从根节点可以触及到这个对象可复活的 1.一旦所有引用被释放,就是可复活状态 2.因为在finalize()中可能复活该对象不可触及的 1.在finalize()后,可能会进入不可触及状态 ...

  6. hibernate 多对多 懒加载问题

    报错:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: net. ...

  7. ubuntu14.04下svn版本管理系统的安装及常用命令的使用整理

    ubuntu14.04下安装svn$sudo apt-get install subversion 执行这一步就安装完成了,在ubuntu先安装很方便 安装完成后,创建版本库目录,由于是本地环境,就在 ...

  8. RedisTemplate操作Redis

    RedisTemplate Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序 ...

  9. 【leetcode刷题笔记】Simplify Path

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  10. hd acm1466

    http://www.cnblogs.com/alihenaixiao/p/4107907.html#undefined.这个博客有详解,我这个只是写一些·自己的总结. 问题:平面上有n条直线,且无三 ...