题解:P2485 [SDOI2011] 计算器

### 思路

本题是一个比较模板化的题目。

#### 一操作

考虑使用快速幂。

快速幂,只需要把 $k$ 变成二进制即可实现 $\Theta(\log k)$ 的时间复杂度。

实现方法:

```cpp
long long qmi(long long a,long long k,long long p){
    long long res = 1;
    while (k){
        if (k & 1){
            res = (res * a) % p;
        }
        a = (a * a) %p;
        k >>= 1;
    }
    return res;
}
```

### 二操作

考虑使用乘法逆元,除一个数等于乘上那个数的逆元,当 $p$ 为质数时,$x$ 的逆元为 $x^{p-2}$。

计算 $x^{p-2}$ 也可以使用快速幂。

### 三操作

考虑使用 BSGS 算法来进行计算,具体实现代码如下:

```cpp
long long bsgs(long long a,long long b,long long p){
    unordered_map<long long,long long>mp;
    if (1 % p == b % p){
        return 0;
    }
    long long k = sqrt(p) + 1;
    for (long long i = 0,j = b % p; i < k; i ++ ){
        mp[j] = i;
        j = (long long)j * a % p;
    }
    long long t = 1 % p;
    for (long long i = 0; i < k; i ++ ){
        t = (long long)t * a % p;
    }
    for (long long i = 1,j = t; i <= k; i ++ ){
        if (mp.count(j)){
            return (long long)i * k - mp[j];
        }
        j = (long long)j * t % p;
    }
    return -1;
}
```

### 最终代码

只需要把给出的那些东西合并起来即可。

```cpp
#include <bits/stdc++.h>
using namespace std;
long long qmi(long long a,long long k,long long p){
    long long res = 1;
    while (k){
        if (k & 1){
            res = (res * a) % p;
        }
        a = (a * a) %p;
        k >>= 1;
    }
    return res;
}
long long bsgs(long long a,long long b,long long p){
    unordered_map<long long,long long>mp;
    if (1 % p == b % p){
        return 0;
    }
    long long k = sqrt(p) + 1;
    for (long long i = 0,j = b % p; i < k; i ++ ){
        mp[j] = i;
        j = (long long)j * a % p;
    }
    long long t = 1 % p;
    for (long long i = 0; i < k; i ++ ){
        t = (long long)t * a % p;
    }
    for (long long i = 1,j = t; i <= k; i ++ ){
        if (mp.count(j)){
            return (long long)i * k - mp[j];
        }
        j = (long long)j * t % p;
    }
    return -1;
}
int main(){
    long long n,T;
    cin >> n >> T;
    if (T == 1){
        for (long long i = 1; i <= n; i ++ ){
            long long a,b,p;
            cin >> a >> b >> p;
            cout << qmi(a,b,p) << endl;
        }
    } 
    else if (T == 2){
        for (int i = 1;  i<= n; i ++ ){
            int a,b,p;
            cin >> a >> b >> p;
            a %= p,b %= p;
            if (a == 0 && b != 0){
                cout << "Orz, I cannot find x!" << endl;
            }
            else{
                cout << qmi(a,p - 2,p) * b % p << endl;
            }
        }
    }
    else{
        for (long long i = 1; i <= n; i ++ ){
            long long a,b,p;
            cin >> a >> b >> p;
            if (a % p == b % p){
                cout << 1 << endl;
                continue;
            }
            a %= p;
            long long t = bsgs(a,b,p);
            if (a == 0 && b == 0){
                cout << 1 << endl;
            }
            else if (a == 0 && b != 0){
                cout << "Orz, I cannot find x!" << endl;
            }
            else{
                if (t == -1){
                    cout << "Orz, I cannot find x!" << endl;
                }
                else{
                    cout << t << endl;
                }
            }
        }
    }
    return 0;
}
```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新构想E-E-A-T:提升销售与搜索可见性的SEO策略

在2025年的数字营销环境中&#xff0c;谷歌的E-E-A-T&#xff08;经验、专业性、权威性、可信度&#xff09;已成为SEO和内容营销的核心支柱。传统的E-E-A-T优化方法通常聚焦于展示作者资质或获取反向链接&#xff0c;但这些策略可能不足以应对AI驱动的搜索和日益挑剔的用户需求…

JVM 一文详解

目录 JVM 简介 JVM 中的内存区域划分 1. 堆&#xff08;一个进程只有一份 ------ 线程共享&#xff09; 2. 栈&#xff08;一个进程可以有 N 份 ------ 线程私有&#xff09; Java 虚拟机栈&#xff1a; 本机方法栈&#xff1a; 3. 程序计数器&#xff08;一个线程可以…

小程序与快应用:中国移动互联网的渐进式革命——卓伊凡的技术演进观

小程序与快应用&#xff1a;中国移动互联网的渐进式革命——卓伊凡的技术演进观 在知乎看到很多&#xff1a;“懂王”发布的要把内行笑疯了的评论&#xff0c;卓伊凡必须怼一下&#xff0c;真印证那句话&#xff0c;无知者无畏 一、Web与小程序的技术本质差异 1.1 浏览器渲染…

[SC]SystemC在GPU/CPU SoC验证中的应用案例

SystemC在GPU/CPU SoC验证中的应用案例 摘要:SystemC 是一种基于 C++ 的系统级建模语言,广泛用于 SoC (System on Chip) 设计的建模和验证,尤其在 GPU SoC 验证中,SystemC 可用于模拟硬件模块、系统行为和性能评估。SystemC 的主要优势在于支持系统级抽象建模、时序…

Java 网络安全新技术:构建面向未来的防御体系

一、Java 安全架构的演进与挑战 1.1 传统安全模型的局限性 Java 平台自 1995 年诞生以来&#xff0c;安全机制经历了从安全管理器&#xff08;Security Manager&#xff09;到 Java 平台模块系统&#xff08;JPMS&#xff09;的演进。早期的安全管理器通过沙箱模型限制不可信…

sonar-scanner在扫描JAVA项目时为什么需要感知.class文件

1 概述 SonarQube是一个静态代码分析工具&#xff0c;主要用于检查源代码的质量&#xff0c;包括代码重复、潜在漏洞、代码风格问题等。而SonarScanner是SonarQube的客户端工具&#xff0c;负责将代码进行形态分析&#xff0c;并将结果发送到SonarQube服务器。所以&#xff0c…

媒资管理之视频管理

一:业务概述: 媒资管理这个模块是我负责开发的,主要的管理对象是视频,图片,文档等 包括文件的上传,视频的处理,文件的删除 (在媒资管理界面,有个上传视频的按钮,视频是在媒资这上传的,课程图片是在内容管理) 上传的图片和视频,会单独存储到搭建的分布式文件系…

Maven 实现多模块项目依赖管理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

nuxt项目中引入并配置 iview

安装iview npm install iview --save注&#xff1a;想要加入其它的配置&#xff0c;可以在 nuxt.config.js 的 plugins 配置项中加入&#xff0c;同时在 plugins 文件夹下加入引入逻辑。 在nuxt.config.js文件中写&#xff1a; {src: ~plugins/iview, ssr: true}同时新建 plugi…

BG开发者日志505:项目总体情况

1、从2024年12月中旬启动&#xff0c;到4月底gameplay部分开发完毕&#xff0c;已经四个半月过去了。 其中大部分内容是3、4两个月中完成的&#xff0c;量产阶段。 预计6月初参加新品节&#xff0c;6月中旬发售&#xff08;比原计划7月中旬提前一个月&#xff09;。 --------…

C++ *stream | istream / ostream / iostream 详解

注&#xff1a;本文为 “C *stream” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 Understanding the Utility of Iostreams in C 理解 C 中 iostream 的用途 By Manoj Debnat…

Dagster中的Ops与Assets:数据管道构建的两种选择

Dagster是一个强大的数据编排平台&#xff0c;它提供了多种工具来帮助数据工程师构建可靠的数据管道。在Dagster中&#xff0c;Ops和Assets是两种核心概念&#xff0c;用于定义数据处理逻辑。本文将全面介绍Ops的概念、特性及其使用方法&#xff0c;特别补充了Op上下文和Op工厂…

参数包展开到初始化列表

上次写过参数包展开和静态断言的使用——Accumulator-CSDN博客&#xff0c;数组是静态定义的&#xff0c;并且递归展开参数包。这里改用动态数组&#xff0c;并且将参数包展开到初始化列表中&#xff0c;成为一个动态数组。 #include <stdio.h> #include <vector>…

React18组件通信与插槽

1、为DOM组件设置Props 在react中jsx中的标签属性被称为Props DOM组件的类属性&#xff0c;为了防止与js中的class属性冲突改成了className DOM组件的style属性 import image from "./logo.svg"; function App() {const imgStyleObj {width: 200,height: 200,};re…

GTS-400 系列运动控制器板(十四)----软限位使用

运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载运动…

C++ 开发指针问题:E0158 表达式必须为左值或函数指示符

问题与处理策略 问题描述 int* ptr &10;执行上述代码&#xff0c;报如下错误 E0158 表达式必须为左值或函数指示符 C2101 常量上的“&”问题原因 10 是一个字面常量&#xff0c;常量是临时值&#xff0c;编译器不会为它们分配可寻址的内存空间 & 取地址运算符…

前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件

目录 一、依赖注入 1、 依赖注入是什么&#xff1f; 2、最基础的使用 3、为什么使用依赖注入&#xff1f; 4、 使用 Symbol 作注入名 二、异步组件 1、什么是异步组件&#xff1f; 2、最基础用法&#xff1a;defineAsyncComponent 3、在模板中使用异步组件 4、配置加载状态…

头歌数据库课程实验(索引与数据库完整性)

第1关&#xff1a;创建一般索引 任务描述 本关任务&#xff1a;为 student 表按姓名升序建立索引&#xff0c;索引名为 idx_sname。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 索引是什么&#xff1b; 索引的分类&#xff1b; 索引的创建和删除&#…

Socket 编程 UDP

Socket 编程 UDP UDP 网络编程V1 版本 - echo serverV2 版本 - DictServerV3 版本 - 简单聊天室 补充参考内容地址转换函数关于 inet_ntoa UDP 网络编程 声明&#xff1a;下面代码的验证都是用Windows作为客户端的&#xff0c;如果你有两台云服务器可以直接粘贴我在Linux下的客…

c++ 二级指针 vs 指针引用

二级指针 vs 指针引用&#xff1a;深入对比与分析 在C中&#xff0c;二级指针和指针引用都可以用于修改外部指针&#xff0c;但它们在语法、安全性和使用场景上有重要区别。下面我将从多个维度进行详细对比。 1. 基本概念 1.1 二级指针 (Pointer to Pointer) int a 10; in…