HDU2035(附所用数论中的性质推导及快速模运算的递归形式)

2023-11-10

Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”

Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Input
2 3
12 6
6789 10000
0 0

Sample Output
8
984
1

如下是取模运算的乘法运算法则
(ab)mod m=[(amodm)(bmodm)] mod m

取模运算还有两个公式
公式①: a b + 1 a^{b+1} ab+1mod m=[a·( a b a^{b} abmod m)] mod m
所以由公式迭代可得 a b + 1 a^{b+1} ab+1mod m=[a·( a b a^{b} abmod m)] mod m=[a·( a·( a b − 1 a^{b-1} ab1mod m)mod m )] mod m=……
解法一正是用了这个迭代公式

证明①:不妨令a=km+h,故
a b + 1 a^{b+1} ab+1mod m=[(a mod m)·( a b a^{b} abmod m)]mod m
=[h·( a b a^{b} abmod m)]mod m
=[(km+h)·( a b a^{b} abmod m)]mod m
=[a·( a b a^{b} abmod m)]mod m


公式②: a b a^{b} abmod m= ( a m o d m ) b (amodm)^{b} (amodm)bmod m

证明②:不妨令a=km+h,故
a b a^{b} abmod m= ( k m + h ) b (km+h)^{b} (km+h)bmod m
= h b h^{b} hbmod m= ( a m o d m ) b (amodm)^{b} (amodm)bmod m


解法一运用公式①(时间复杂度比快速模运算算法高)


#include <iostream>
using namespace std;

int main()
{
    long long base,exponential;//分别代表底数与指数
    while(cin>>base&&cin>>exponential&&base!=0&&exponential!=0){
        int result=1;
        for(int i=0;i<exponential;i++){
            result=base*result%1000;//运用了公式①
        }
        cout<<result<<endl;
    }
    return 0;
}


解法一的递归形式也特别容易给出

#include <iostream>
using namespace std;

int fastMod(int a,int n)
{
    if(n==0){
        return 1;
    }
    else{
        return (a*(fastMod(a,n-1)))%1000;
    }
}

int main()
{
    int a,n;
    cin>>a>>n;
    cout<<fastMod(a,n);
    return 0;
}



解法二:快速模运算
其与下面的快速幂运算的代码十分类似

int fastPower(int a,int n)
{
    int base=a;
    int result=1;
    while(n){
        if(n&1){
            result*=base;
        }
        base*=base;
        n>>=1;
    }
    return result;
}

快速模运算的原理:将b用二进制的方法表示后重复使用公式(ab)mod m=[(amodm)(bmodm)] mod m对 a b a^{b} abmod m进行展开.

a 5 a^{5} a5%m的快速模运算求解过程

exponential result=(result*base)%m base=(base*base)%m
101 a%m a 2 a^{2} a2%m
10 是0,result不变 [( a 2 a^{2} a2%m)*( a 2 a^{2} a2%m)]%m
1 {(a%m)* [( a 2 a^{2} a2%m)*( a 2 a^{2} a2%m) %m]} %m
0
exponential==0时结束了

此时result=={(a%m)* [( a 2 a^{2} a2%m)*( a 2 a^{2} a2%m) %m]} %m满足根据取模运算的乘法运算法则展开后得到的式子



如下是快速模运算此题代码

#include <iostream>
using namespace std;
int main() {
    long long base,exponential;
    //优化:此处为了防止base太大,可根据公式②先对base进行一次取模运算,即base=base%1000;
    while(cin>>base&&cin>>exponential&&base!=0&&exponential!=0) {
        int result=1;
        while(exponential) {
            if(exponential&1) {//指数为奇数时
                result=(result*base)%1000;
            }
            exponential>>=1;//相当于exponential/=2;
            base=(base*base)%1000;
        }
        cout<<result<<endl;
    }
    return 0;
}

解法三:快速模运算的递归形式
其也与下面的快速幂运算的递归形式代码十分类似

int fastPower(int a,int n)
{
    if(n==1){
        return a;
    }
    if(n&1){
        return a*fastPow(a*a,n/2);
    }
    else{
        return fastPow(a*a,n/2);
    }
}



由取模运算的乘法运算法则分奇偶也易得快速模运算的递归形式代码
#include <iostream>
using namespace std;

int fastMod(int a,int n)
{
    if(n==0){
        return 1;
    }
    if(n&1){
        return (((fastMod(a,n/2))*(fastMod(a,n/2)))%1000*(a%1000))%1000;
    }
    else{
        return ((fastMod(a,n/2))*(fastMod(a,n/2)))%1000;
    }
}

int main()
{
    int a,n;
    cin>>a>>n;
    cout<<fastMod(a,n);
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HDU2035(附所用数论中的性质推导及快速模运算的递归形式) 的相关文章

  • VS2015出现“在当前源文件目录或生成系统文件目录中未找到xxx.h”完美解决

    用VS打开一个项目 在编译的时候会出现 corecrt h Nosuchfileordirectory 这样一个问题 其实这就是找不到对应的头文件 这个是VS自带的 说白了就是路径的问题 后来 我在vc 包含目录和库目录添加了对应的头文件和
  • git提交新项目到github上

    博客引用处 以下内容在原有博客基础上进行补充或更改 谢谢这些大牛的博客指导 如何将idea本地已有的新项目完整提交到gitlab上 利用git提交代码 1 Idea的方式 使用idea开发工具新建了一个项目工程 此时该项目工程是没有任何的版

随机推荐

  • C++ 基本的输入输出

    C 标准库提供了一组丰富的输入 输出功能 我们将在后续的章节进行介绍 本章将讨论 C 编程中最基本和最常见的 I O 操作 C 的 I O 发生在流中 流是字节序列 如果字节流是从设备 如键盘 磁盘驱动器 网络连接等 流向内存 这叫做输入操
  • 5.27下周黄金行情走势预测及开盘操作策略

    近期有哪些消息面影响黄金走势 下周黄金多空该如何研判 黄金消息面解析 周五 5月26日 黄金大幅下跌 主要受到美国数据影响 美国公布的4月PCE和耐用品订单数据向好 再次强化市场对美联储的鹰派押注 现货黄金收报1946 63美元 盎司 目前
  • 联想拯救者2020R7000双系统装机记录_自用

    文章目录 材料 一 启动盘制作 1 下载ubuntu镜像文件 2 下载刻录工具UltralSO 3 使用UltralSO刻录Ubuntu镜像到U盘内 二 电脑设置 1 创建硬盘空白分区 2 设置BIOS 三 安装系统 1 重新开机的过程中摁
  • 【量化投资】离散傅里叶变换求数组周期

    好久没有更新量化分析相关的内容 本节将介绍如何通过傅里叶变换求解一组数据当中可能存在的周期性 后续将应用本节的结果实际在量化程序中进行应用 本文计算方法不一定正确 欢迎大家多多指正 并在评论区进行交流 1 离散傅里叶变换 离散傅里叶变换的公
  • C++版 - 剑指offer 面试题30:最小的K个数(topK问题) 题解

    剑指offer 面试题30 最小的K个数 题目 输入n个整数 找出其中最小的k个数 例如 例如输入4 5 1 6 2 7 3 8 这8 个数字 则最小的4 个数字是1 2 3 4 提交网址 http www nowcoder com pra
  • java——网络编程

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 网
  • Google C++编码规范(中文版)

    记录下Google C 编码规范 方便后面学习 网址如下 https zh google styleguide readthedocs io en latest
  • 显示器校正

    注意事项 1 显示器校准的环境应注意 防止外来强烈光线进入室内尤其室外强光 2 工作环境的物体 例如墙 地板 桌面等等要接近中性灰 防止环境影响视觉的判断 3 显示器要使用遮光罩 防止环境光和杂散光直接射到显示器的表面 4 操作者要穿深色衣
  • 多线程结合sprongboot事务(完善)

    避坑指南 1 Async Transactional不能在同一个方法上注解使用 原因Spring实现AOP的方法则就是利用了动态代理机制 正因如此 才会导致某些情况下 Async和 Transactional不生效 比如下面的将事务事务控制
  • 从Java到Go:使用Go语言实现OAuth2和JWT身份验证和授权服务

    目录 1 概述 2 OAuth2和JWT简介 2 1 OAuth2 2 2 JWT 3 从Java到Go 基本语法差异 3 1 变量声明和初始化
  • Echarts 桑基图的详细配置过程

    文章目录 桑基图 简介 配置步骤 简易示例 桑基图 简介 Echarts桑基图 Sankey Diagram 是一种数据可视化图表类型 用于展示流量 能量 资金等在各个节点之间的流动和转化关系 桑基图通过节点和曲线来表示不同元素之间的关系
  • centos7修改root用户密码

    一 如果知道旧密码 已经登录进去了 则 使用命令修改即可 修改即刻生效 不需要重启 1 修改系统用户root密码 root ITCATS 01 passwd 更改用户 root 的密码 新的 密码 2 修改系统非root用户密码 huazi
  • Flutter混合开发(二)Flutter 以 Module 形式 接入已经存在的Android原生项目中

    上一篇文章讲解了Flutter 打包AAR 嵌入的流程 这一篇就讲一下 module 的形式 做个简单的记录 也希望可以帮助到最近在学习Flutter混合开发的小伙伴 这里都是按最简单的方式进行载入的 来直接上图 如果已经有 Android
  • 异步FIFO的低水线判定

    最近做一个模块 需要用异步FIFO把链路层发来的局部不定时突发数据重建成连续稳定输出的视频流 输出要达到连续稳定的话 开始输出之前 需要在FIFO里攒够一定数量的数据 即FIFO的低水线 用于防止underflow 对应的还有高水线 即数据
  • 211院校计算机考研难度排名,全国211院校考研难度详细分析!建议收藏!

    原标题 全国211院校考研难度详细分析 建议收藏 很多考研的童鞋 都是为了提升自己的学历而来 梦想着考取名校 圆自己一个名校梦 希望是光明的 道路是曲折的 通向名校的道路 往往竞争十分惨烈 帮大家分析各大高校的考研难度 让小伙伴们能在考研之
  • C++ C#自动获得特定串口 获得串口列表

    目的 自动获得特定串口 0 C 自动获得特定串口 读设备管理器 计算机管理 串口列表 PrintDeviceInfo cpp 定义控制台应用程序的入口点 include
  • 人工智能学习----Pandas进阶及统计分析

    人工智能学习 Pandas进阶及统计分析 目录 一 基本数据对象及操作 二 数据清洗 三 数据合并及分组 四 透视表 目录 基本数据对象及操作 数据清洗 数据合并及分组 透视表 一 基本数据对象及操作 1 Series 类似一维数组的对象
  • Java实现Excel转PDF的两种方法总结

    hello 你好呀 我是灰小猿 一个超会写bug的程序猿 使用具将Excel转为PDF的方法有很多 在这里我给大家介绍两种常用的方法 分别应对两种不一样的使用场景 接下来我在springboot环境下给大家做一下演示 一 使用spire转化
  • 低成本运行 Spark 数据计算

    作者 柳密 阿里巴巴阿里云智 导读 本节课主要介绍如何在 Serverless Kubernetes 集群中低成本运行 Spark 数据计算 首先简单介绍下阿里云 Serverless Kubernetes 和 弹性容器实例 ECI 这两款
  • HDU2035(附所用数论中的性质推导及快速模运算的递归形式)

    Problem Description 求A B的最后三位数表示的整数 说明 A B的含义是 A的B次方 Input 输入数据包含多个测试实例 每个实例占一行 由两个正整数A和B组成 1 lt A B lt 10000 如果A 0 B 0