当前位置: 首页 > news >正文

模运算和快速幂

文章目录

    • 模运算
    • 快速幂

模运算

模运算是大数运算中的常用操作。如果一个数太大,无法直接输出,或者不需要直接输出,则可以对它取模,缩小数值再输出。取模可以防止溢出,这是常见的操作。

取模运算一般要求a和m的符号一致,即都为正数或都为负数。如果正负不同,那么请小心处理 模运算与基本四则运算有些相似,但是除法例外。其规则如下:

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p) % p

注意负数取模的问题,尽量保证(a-b)为正数 ,如果a-b为负数 则可以写成
((a-b)%p+p)%p 例如 -3%5=-3 (-3%5+5)%5=2

(a * b) % p = (a % p * b % p) % p

(a^b) % p = ((a % p)^b) % p
模运算例题

public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);long a=scan.nextLong();long b=scan.nextLong();long c=scan.nextLong();long day=0;long x=a*5+b*2;long week=c/x;long last=c%x;if(last>0) {if(last<5*a){long m=last/a;if(last%a>0)day=m+1;elseday=m;}else{last-=5*a;long m=last/b;if(last%b>0)day=5+m+1;elseday=5+m;}}System.out.println(week*7+day);scan.close();}
}

例题代码。

快速幂

1.算法思想
将指数n表示为其二进制形式,例如,n = 13 可表示为 1101。
从二进制形式的最低位开始,逐位检查: 如果当前位为1,则将结果乘以对应的底数的幂 每次将底数的幂平方,即底数的幂乘以自身,同时将指数右移一位。
继续处理下一位,直到所有位都处理完毕,此时得到最终结果。
1、 当指数是偶数时,我们可以让指数除以2,底数乘以底数 2、 当指数是奇数时,我们可以将指数减1变为偶数

当幂%2==0,也就是当幂为偶数时,根据幂的运算法则,我们可以将幂除以2,然后底数进行平方操作,值保持不变。

当幂%2= =1,也就是当幂为奇数时,将幂为奇数的底数保存起来,再对幂-1,重复上面的操作。

最后的结果就是将幂为奇数的底数综合相乘。

long long int quik_power(int base, int power)
{long long int result = 1;while (power > 0)           //指数大于0进行指数折半,底数变其平方的操作{if (power % 2 == 1)     //指数为奇数{power -= 1;         //指数减一power /= 2;         //指数折半result *= base;     //分离出当前项并累乘后保存base *= base;       //底数变其平方}else                    //指数为偶数{power /= 2;         //指数折半base *= base;       //底数变其平方}}return result;              //返回最终结果
}
效率更高的写法
```java
long long int quik_power(int base, int power)
{long long int result = 1;while (power > 0)           //指数大于0进行指数折半,底数变其平方的操作{if (power & 1)			//指数为奇数,power & 1这相当于power % 2 == 1result *= base;     //分离出当前项并累乘后保存power >>= 1;			//指数折半,power >>= 1这相当于power /= 2;base *= base;           //底数变其平方}return result;              //返回最终结果
}

`
在这里插入图片描述
在这里插入图片描述

public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);long b=scan.nextLong();long p=scan.nextLong();long k=scan.nextLong();long s=1;while(p>0){if((p&1)==1){s=s*b%k;}b=b*b%k;p>>=1;}System.out.println(s);scan.close();}
}


快速幂

public class Main {static long ksm(long a,long b,long n){long ret=1;while(b>0){if((b&1)==1){ret=ret*a%n;}a=a*a%n;b>>=1;}return ret;}public static void main(String[] args) {Scanner scan = new Scanner(System.in);long a=scan.nextLong();long b=scan.nextLong();long n=scan.nextLong();long x=ksm(10,n+2,b*1000);System.out.println(a*x%(b*1000)/b);scan.close();}
}

小数第n位
不懂可以参考这篇博客小数第n位解析

http://www.lryc.cn/news/456655.html

相关文章:

  • 【机器学习】——神经网络与深度学习:从基础到应用
  • Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出
  • QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结
  • Linux No space left on device分析和解决
  • Qt实现Halcon窗口显示当前图片坐标
  • 构建宠物咖啡馆:SpringBoot框架的实现策略
  • Qt开发环境的搭建
  • docker-compose查看容器日志和实时查看日志
  • MVC、MVP和MVVM之间的区别
  • uni-app 打包成app时 限制web-view大小
  • 智能指针(2)
  • [含文档+PPT+源码等]精品基于Nodejs实现的家教服务小程序的设计与实现
  • electron打包报错-winCodeSign无法下载
  • 给Windows系统设置代理的操作方法
  • 高质量带货短视频素材来源推荐
  • torchvision.transforms.Resize()的用法
  • 简单认识 redis -数据类型命令
  • Python 语言学习——应用1.2 数字图像处理(第二节,变换)
  • 【QT Quick】页面布局:手动定位与坐标系转换
  • uniapp自定义导航,全端兼容
  • [论文阅读] DVQA: Understanding Data Visualizations via Question Answering
  • 【PostgreSQL】实战篇——数据备份和恢复的最佳实践和工具
  • 代码随想录算法训练营第二十九天|93.复原IP地址 78.子集 90.子集II
  • 【mysql】使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解
  • 希沃冰点还原
  • Hadoop服务端口号、Spark端口号、Hive端口号以及启动命令
  • 【C++】--类和对象(3)
  • 国外电商系统开发-运维系统文件上传-高级上传
  • 【MongoDB】mongodb | 部署 | 常用命令
  • 【Chrome浏览器插件--资源嗅探猫抓】