快速冪(求解原理+例題)

目錄

反復平方法(快速冪):

代碼:?

例題:快速冪求逆元


作用:

????????快速求出?a^k \ mod \ p?的結果。

時間復雜度:

????????O(logk)

? ? ? ? 如果使用一般做法,從1循環到k,時間復雜度是O(k)

?

反復平方法(快速冪):

? ? ? ? 將?k?用二進制表示:(k)_{10}=(....)_2

? ? ? ? 那么??k = 2^{x_1}+2^{x_2} + ... +2^{x_t}\ \ \ x_t<=log_2k

? ? ? ? 因此??a^k \ =\ a^{2^{x_1}+2^{x_2}+...+2^{x_t}} \ \ \ x_t<=log_2k

? ? ? ? 我們可以把?a^k?拆分成??a^k \ =\ a^{2^{x_1}} * a^{2^{x_2}} *... * a^{2^{x_t}} \ \ \ x_t<=log_2k?

? ? ? ? 因此我們只需要預處理出下面的,就可以解決上述方法:

?????????a^{2^0} \ mod \ p\\a^{2^1} \ mod\ p\\a^{2^2}\ mod\ p\\.\\.\\a^{2^{logk}}\ mod \ p

? ? ? ? 如何求解這些需要預處理:

? ? ? ? 每次乘2

????????

qmi(long a,long k,long p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p; // 如果該位是1k = k>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);
}

? ? ? ? ?該代碼使用了一種位運算技巧。

????????位運算---求n的二進制表示中第k位是1還是0 (lowbit)-CSDN博客

例子:

?

?

標準例題代碼:?

給定?n 組?ai,bi,pi,對于每組數據,求出?a_i^{b_i}\ mod\ p_i 的值。

輸入格式

第一行包含整數?n。

接下來?n?行,每行包含三個整數?ai,bi,pi。

輸出格式

對于每組數據,輸出一個結果,表示?a_i^{b_i}\ mod\ p_i 的值。

每個結果占一行。

數據范圍

1≤n≤100000,
1≤ai,bi,pi≤2×10^9

輸入樣例:

2
3 2 5
4 3 9

輸出樣例:

4
1

import java.util.*;
import java.io.*;class Main{static final int N = 100010;static int n;public static void main(String[] args) throws IOException{BufferedReader in = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(in.readLine());while(n-->0){String[] s = in.readLine().split(" ");long a = Long.parseLong(s[0]);long b = Long.parseLong(s[1]);long p = Long.parseLong(s[2]);qmi(a,b,p); // 快速冪}}public static void qmi(long a,long b,long p){long res = 1;while(b!=0){if((b&1)==1) res = res*a%p; // 如果該位是1b = b>>1; // 右移一位a = a*a%p; //每次乘2}System.out.println(res);}
}

例題:快速冪求逆元

? ? ? ? 費馬定理。

給定?n?組?ai,pi,其中?pi?是質數,求?ai?模?pi?的乘法逆元,若逆元不存在則輸出?impossible

注意:請返回在?0~p?1?之間的逆元。

乘法逆元的定義

若整數?b,m 互質,并且對于任意的整數?a,如果滿足?b|a,則存在一個整數?x,使得 \frac{a}{b}\equiv a*x\ (mod \ m),則稱?x?為?b?的模?m?乘法逆元,記為?b^{-1}\ (mod\ m)

b?存在乘法逆元的充要條件是?b?與模數?m?互質。當模數?m?為質數時,b^{m-2}?即為?b?的乘法逆元。

輸入格式

第一行包含整數?n。

接下來?n?行,每行包含一個數組?ai,pi,數據保證?pi?是質數。

輸出格式

輸出共?n?行,每組數據輸出一個結果,每個結果占一行。

若?ai?模?pi?的乘法逆元存在,則輸出一個整數,表示逆元,否則輸出?impossible

數據范圍

1≤n≤10^5,
1≤ai,pi≤2?10^9

輸入樣例:

3
4 3
8 5
6 3

輸出樣例:

1
2
impossible

解決方法:

?????????\frac{a}{b}\equiv a*x\ (mod \ m)

? ? ? ?由題意可知:?\frac{a}{b}\equiv a*b^{-1}\ (mod \ m)

????????{a}\equiv a*b*b^{-1}\ (mod \ m)

????????b*b^{-1}\equiv 1\ (mod \ m)

????????x?為?b?的模?m?乘法逆元,記為?b^{-1}\ (mod\ m),因此?b*x\equiv 1\ (mod \ m)

? ? ? ? 由費馬定理可知:

??????????????????????????????????????????????b^{p-1}\ \equiv \ 1\ (mod\ p)\\b*b^{p-2} \ \equiv \ 1\ (mod\ p)

? ? ? ? 因此,x = b^{p-2}\ (mod \ p)

? ? ? ? 再使用快速冪解決:

import java.util.*;
import java.io.*;
class Main{static int n;public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));n = Integer.parseInt(br.readLine());while(n-->0){String[] s = br.readLine().split(" ");int a = Integer.parseInt(s[0]);int p = Integer.parseInt(s[1]);long res = qmi(a,p-2,p);if(a%p==0) System.out.println("impossible");else System.out.println(res);}}public static long qmi(int a,int k,int p){long res = 1;while(k!=0){if((k&1)==1) res = res*a%p;k = k>>1;a = (int)((long)a*a%p);}return res;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718389.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

低代碼流程引擎實戰:讓表單字段成為流程節點審批人的得力助手!

在現代企業的日常運營中&#xff0c;流程審批是保障工作高效、規范進行的關鍵環節。隨著企業對于靈活性和高效性的需求不斷增長&#xff0c;傳統的固定審批人設置已無法滿足多變的業務場景。在JVS低代碼中“設置流程節點審批人為表單字段”這一功能&#xff0c;旨在通過動態配置…

C#入門:簡單數據類型和強制類型轉換

本文由 簡悅 SimpRead 轉碼&#xff0c; 原文地址 mp.weixin.qq.com 本期來講講 unity 的腳本語言 —C#&#xff0c;C# 的簡單數據類型及范圍和強制類型轉化的方法。這可是 unity 游戲開發必備技能。 1. 簡單數據類型 各個類型的范圍&#xff1a; byte -> System.Byte (字節…

黑馬點評-短信登錄業務

原理 模型如下 nginx nginx基于七層模型走的事HTTP協議&#xff0c;可以實現基于Lua直接繞開tomcat訪問redis&#xff0c;也可以作為靜態資源服務器&#xff0c;輕松扛下上萬并發&#xff0c; 負載均衡到下游tomcat服務器&#xff0c;打散流量。 我們都知道一臺4核8G的tomca…

網絡問題排查必備利器:Pingmesh

背景 當今的數字化世界離不開無處不在的網絡連接。無論是日常生活中的社交媒體、電子商務&#xff0c;還是企業級應用程序和云服務&#xff0c;我們對網絡的依賴程度越來越高。然而&#xff0c;網絡的可靠性和性能往往是一個復雜的問題&#xff0c;尤其是在具有大規模分布式架…

21.Prometheus的查詢數據類API

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識,帶你從懵懂少年走向人生巔峰,迎娶白富美! 關注微信公眾號【 IT特靠譜 】,每天都會分享技術心得~ 1.數據查詢類API 1.1.API前綴路徑說明 …

lanqiao:42點

題解&#xff1a; 1.首先&#xff0c;把字符轉成數字。 2.創建二維數組存放枚舉的結果&#xff0c;第一行一個數字13&#xff1b;第二行4個數字&#xff0c;分別是13和1的加減乘除&#xff1b;第三行16個數字&#xff0c;分別是第二行的每個數和12加減乘除的結果&#xff1b;…

基于SpringBoot的在線拍賣系統

目錄 1、 前言介紹 2、主要技術 3、系統流程和邏輯 4、系統結構設計 5、數據庫設計表 6、運行截圖(部分) 6.1管理員功能模塊 6.2用戶功能模塊 6.3前臺首頁功能模塊 7、源碼獲取 基于SpringBoot的在線拍賣系統錄像 1、 前言介紹 隨著社會的發展&#xff0c;社會的各行…

安卓玩機工具推薦----ADB狀態讀寫分區 備份分區 恢復分區 查看分區號 工具操作解析

在以往玩機過程中。很多機型備份分區 備份固件需要借助adb手動指令或者第三方手機軟件或者特定的一些工具來操作。有些朋友需要查看當前機型分區名稱和對應的分區號。此類操作我前面的博文專門說過對應的adb指令。但有些界面化的工具比較方便簡單。 相關分區同類博文&#xff…

【C++】每周一題——2024.3.3(手滑再再寫一篇)

題目 Cpp 【問題描述】 求N個字符串的最長公共子串&#xff0c;2 < N&#xff1c;&#xff1d;20&#xff0c;字符串長度不超過255。 例如&#xff1a;N&#xff1d;3&#xff0c;由鍵盤依次輸入三個字符串為 What is local bus? Name some local buses. local bus is a h…

SpringBoot源碼解讀與原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程

文章目錄 前言12.4 DispatcherServlet的工作全流程12.4.1 DispatcherServlet#service12.4.2 processRequest12.4.3 doService12.4.3.1 isIncludeRequest的判斷12.4.3.2 FlashMapManager的設計 12.4.4 doDispatch12.4.4.1 處理文件上傳請求12.4.4.2 獲取可用的Handler&#xff0…

sscanf 函數的用法

sscanf 函數是 C 語言標準庫 <stdio.h> 中的一個函數&#xff0c;用于按照指定的格式從一個字符串中讀取輸入。它的用法類似于 scanf 函數&#xff0c;但是 sscanf 從字符串中讀取輸入&#xff0c;而不是從標準輸入&#xff08;鍵盤&#xff09;中讀取輸入。 以下是 ssc…

優優嗨聚集團:美團代運營服務,商家增長的新引擎

在當今數字化時代&#xff0c;線上平臺已成為商家拓展業務、提升品牌影響力的重要渠道。美團作為國內領先的本地生活服務平臺&#xff0c;擁有龐大的用戶群體和豐富的商業資源。然而&#xff0c;對于許多商家而言&#xff0c;如何在美團平臺上進行有效運營&#xff0c;實現業務…

Redis做分布式鎖如何處理超時時間?

在使用Redis實現分布式鎖時&#xff0c;處理超時時間是非常重要的&#xff0c;以確保在獲取鎖的客戶端在一定時間內未能完成任務時&#xff0c;鎖能夠自動釋放&#xff0c;避免造成死鎖或長時間的阻塞。下面是一種處理超時時間的方法&#xff1a; 獲取鎖時設置超時時間&#xf…

雙線服務器有哪些安全防御措施?

雙線服務器的出現給企業帶來了更廣泛的業務發展&#xff0c;用戶不再是固定的群體&#xff0c;而是有了一定的選擇性&#xff0c;服務器的性能與可靠性進行了增強&#xff0c;使網絡的運行速度變得更加流暢&#xff0c;給用戶帶來了良好的體驗感。 今天我們主要就來聊一聊雙線服…

【IOS】啟動報錯Cannot launch ‘/private/var/containers/Bundle/Application/....‘

問題 IOS項目啟動報錯Cannot launch ‘/private/var/containers/Bundle/Application/***.app’: Sending qLaunchSuccess packet failed 或者類似報錯問題 無法啟動launch的 解決 問題定位 我是在操作期間更換了應用的簽名證書 也就是Signing & Capablities -> Sign…

【LeetCode:232. 用棧實現隊列 + 棧 | 隊列】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

力扣74. 搜索二維矩陣(二分查找)

Problem: 74. 搜索二維矩陣 文章目錄 題目描述思路復雜度Code 題目描述 思路 思路1&#xff1a;映射為一維數組二分查找 1.由于題目矩陣中的元素整體是升序的&#xff0c;我們可以將其放置在一個大小為 m n m \times n mn的一維數組array中進行二分查找 2.對應的映射關系是ar…

NACOS在Windows和Linux下的安裝教程

目錄 1、Windows安裝 1.1、下載安裝包 1.2、解壓 1.3、端口配置 1.4、啟動 1.5、訪問 2、Linux安裝 2.1、安裝JDK 2.2、上傳安裝包 2.3、解壓 2.4、端口配置 2.5、啟動 3、Nacos的依賴 1、Windows安裝 開發階段采用單機安裝即可。 1.1、下載安裝包 在Nacos的Git…

Vue+SpringBoot打造圖書借閱系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 登陸注冊模塊2.2 圖書管理模塊2.3 圖書評論模塊2.4 圖書預定模塊2.5 圖書資訊模塊 三、系統設計3.1 系統結構設計3.1.1登陸注冊模塊的結構設計3.1.2圖書管理模塊的結構設計3.1.3圖書評論模塊的結構設計3.1.4圖書預定模塊…