这题其实就是快速求一个高次幂的模。

这是题目的答案

#include<iostream>
#include<cmath> using namespace std; int a[];
int b[]; int mod(int a, int b, int c)
{
int z = ;
while(b)
{
if(b%)
z = (z*a)%c;
b/=;
a = (a*a)%c;
}
return z;
} int main()
{
int T;
cin>>T;
while(T--)
{
int M;
int H;
cin>>M>>H;
for(int i=; i<H; i++)
{
cin>>a[i]>>b[i];
}
int t =;
int mode = ;
while(t<H)
{
int tem0 = a[t]%M;
mode = (mod(tem0,b[t],M) + mode)%M;
t++;
}
cout<<mode<<endl;
}
}

只分析求幂—模的那个函数,先举例吧(a a a a a a a a a a)这是b个a (b =10),通过z来记录二分时多出来的一个a,每次二分后用a来代替a*a,这样就得到了缩小规模的结果。最后肯定是b=1,所以这时只需用现在的a与z结合就是最后的结果了。

int mod(int a, int b, int c)
{
int z = ;
while(b)
{
if(b%)
z = (z*a)%c;
b/=;
a = (a*a)%c;
}
return z;
}

这个函数的写法就是二分法而已,但是刚开始时我写的是这样的

long long F(long long a, long long b, long long m)
{
if(b==)
return a%m;
else if(b%==)
return (F(a,b/,m)*F(a,b/,m))%m;
else
return (F(a,b/,m)*F(a,b/,m)*a%m);
}

这样写的结果是RE,估计是递归太深导致堆栈溢出了,这个写的很差,根本没有起到二分的效果,反而比O(n)还要费时间。

最新文章

  1. EventBus3.0源码解析
  2. 如何启动redis
  3. SQLSERVER 数值 四舍五入取整 向上取整 向下取整
  4. mysql启动不成功显示The server quit without updating PID file的解决方法
  5. Memcache 提高缓存命中率
  6. SQL Server数据库性能优化(一)之 优化SQL 语句
  7. Bootstrap——基本模板
  8. RDD缓存策略
  9. cmd中无法运行svn命令
  10. Cannot resolve the collation conflict between &quot;SQL_Latin1_General_CP1_CI_AS&quot; and &quot;Latin1_General_100_CI_AS&quot; in the equal to operation.
  11. java的&quot;==&quot;与&quot;equals&quot;
  12. MySQL(12):windows下解决mysql忘记密码
  13. 分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器
  14. 给 endv 取个好名字有赏!
  15. bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
  16. edge box
  17. 【JavaFx教程】第四部分:CSS 样式
  18. redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合
  19. 3、NPM使用
  20. IOC控制反转

热门文章

  1. LightOJ 1138 二分
  2. HTTP- 头部信息
  3. Delpih - Format
  4. 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)
  5. 用一句SQL取出第 m 条到第 n 条记录的方法
  6. unity的一些重要技巧(转)【整理他人的东西】
  7. 13 Python 函数进阶
  8. php 代码中的箭头“ -&gt;”与“=&gt;”是什么意思?
  9. nodejs 解析 base64 文本
  10. android 网络编程--socket tcp/ip udp http之间的关系