Raising Modulo Numbers(ZOJ 2150)
2024-10-20 03:45:36
这题其实就是快速求一个高次幂的模。
这是题目的答案
#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)还要费时间。
最新文章
- EventBus3.0源码解析
- 如何启动redis
- SQLSERVER 数值 四舍五入取整 向上取整 向下取整
- mysql启动不成功显示The server quit without updating PID file的解决方法
- Memcache 提高缓存命中率
- SQL Server数据库性能优化(一)之 优化SQL 语句
- Bootstrap——基本模板
- RDD缓存策略
- cmd中无法运行svn命令
- Cannot resolve the collation conflict between ";SQL_Latin1_General_CP1_CI_AS"; and ";Latin1_General_100_CI_AS"; in the equal to operation.
- java的";==";与";equals";
- MySQL(12):windows下解决mysql忘记密码
- 分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器
- 给 endv 取个好名字有赏!
- bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
- edge box
- 【JavaFx教程】第四部分:CSS 样式
- redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合
- 3、NPM使用
- IOC控制反转