POJ1995:Raising Modulo Numbers
二进制前置技能: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的更多相关文章
- POJ 1995:Raising Modulo Numbers 快速幂
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5532 Accepted: ...
- POJ1995 Raising Modulo Numbers(快速幂)
POJ1995 Raising Modulo Numbers 计算(A1B1+A2B2+ ... +AHBH)mod M. 快速幂,套模板 /* * Created: 2016年03月30日 23时0 ...
- POJ1995 Raising Modulo Numbers
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6373 Accepted: ...
- poj1995 Raising Modulo Numbers【高速幂】
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5500 Accepted: ...
- POJ:1995-Raising Modulo Numbers(快速幂)
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9512 Accepted: 578 ...
- 【POJ - 1995】Raising Modulo Numbers(快速幂)
-->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1 B1 A2 B2 A3 B3 ......... AH ...
- poj 1995 Raising Modulo Numbers【快速幂】
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5477 Accepted: ...
- Raising Modulo Numbers(POJ 1995 快速幂)
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5934 Accepted: ...
- poj 1995 Raising Modulo Numbers 题解
Raising Modulo Numbers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6347 Accepted: ...
随机推荐
- POJ 1584 A Round Peg in a Ground Hole【计算几何=_=你值得一虐】
链接: http://poj.org/problem?id=1584 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- php记录百度等搜索引擎蜘蛛的来访记录
<?php function is_robot() { $useragent = strtolower($_SERVER['HTTP_USER_AGENT']); if (strpos($use ...
- php在不同平台下路径分隔符不同的解决办法
在看phpamf时看到一个常量“DIRECTORY_SEPARATOR”,最后发现是一个全局的常量,用来定义路径分隔符的 主要解决在windows和linux下路径分隔符不同的造成代码不通用的问题,在 ...
- 5.Django数据库配置
Django默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver需要安装第三方的支持 配置Django数据库:\hello_django\hello ...
- jQuery实现复选框全选/所有取消/反选/获得选择的值
<!DOCTYPE html> <html> <head> <script type="text/javascript" src=&quo ...
- 图形数据库(GraphDB)
Date: 2016-01-27 Title: 图形数据库-1 Published: true Type: post Excerpt: Category: GraphDB 图形数据库(GraphDB) ...
- JVM性能优化, Part 5 Java的伸缩性
很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题.我说过JVM的自身技术限制了Java企业级应用的伸缩性 ...
- simple--factory--abstract
<?php /* 示例2: */ //简单工厂模式 /* * 定义运算类 */ abstract class Operation { protected $_NumberA = 0; prote ...
- 通过tile和url判断页面跳转是否正确
通过webdriver中的.title和.current_url获取title和url from time import sleep from selenium import webdriver br ...
- [原创]java WEB学习笔记02:javaWeb开发的目录结构
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...