(擴展)歐幾里德快速冪

?

GCD模板

__int64 gcd(__int64 a,__int64  b)
{return b==0? a:gcd(b,a%b);
}

?歐幾里德算法又稱輾轉相除法,用于計算兩個整數a,b的最大公約數。其計算原理依賴于下面的定理:

  gcd函數就是用來求(a,b)的最大公約數的。

  gcd函數的基本性質:

  gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)

證明:

基本算法:設a=qb+r,其中a,b,q,r都是整數,則gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

第一種證明:

? ? ? a可以表示成a = kb + r,則r = a mod b

  假設d是a,b的一個公約數,則有

  d|a, d|b,而r = a - kb,因此d|r

  因此d是(b,a mod b)的公約數

  假設d 是(b,a mod b)的公約數,則

  d | b , d |r ,但是a = kb +r

  因此d也是(a,b)的公約數

  因此(a,b)和(b,a mod b)的公約數是一樣的,其最大公約數也必然相等,得證。

第二種證法:

第二種證明:

? ??要證歐幾里德算法成立,即證: gcd(a,b)=gcd(b,r),其中 gcd是取最大公約數的意思,r=a mod b
??? 下面證 gcd(a,b)=gcd(b,r)
??? 設? c是a,b的最大公約數,即c=gcd(a,b),則有 a=mc,b=nc,其中m,n為正整數,且m,n互為質數
??? 由 r= a mod b可知,r= a- qb 其中,q是正整數,
??? 則 r=a-qb=mc-qnc=(m-qn)c
??? b=nc,r=(m-qn)c,且n,(m-qn)互質(假設n,m-qn不互質,則n=xd, m-qn=yd 其中x,y,d都是正整數,且d>1
??????????????????????????????????????????????????????????????? 則a=mc=(qx+y)dc, b=xdc,這時a,b 的最大公約數變成dc,與前提矛盾,
???????????????????????????????????????????????????????????????? 所以n ,m-qn一定互質)
??? 則gcd(b,r)=c=gcd(a,b)
??? 得證。

?

擴展歐幾里德定理

  對于不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整

  數對 x,y ,使得 gcd(a,b)=ax+by。

證明:

基本算法:對于不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整數對 x,y ,使得 gcd(a,b)=ax+by。

證明:設 a>b。

  1,顯然當 b=0,gcd(a,b)=a。此時 x=1,y=0;

  2,ab!=0 時

  設 ax1+by1=gcd(a,b);

  bx2+(a mod b)y2=gcd(b,a mod b);

  根據樸素的歐幾里德原理有 gcd(a,b)=gcd(b,a mod b);

  則:ax1+by1=bx2+(a mod b)y2;

  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

  根據恒等定理得:x1=y2; y1=x2-(a/b)*y2;

? ? ?這樣我們就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.

  ?上面的思想是以遞歸定義的,因為 gcd 不斷的遞歸求解一定會有個時候 b=0,所以遞歸可以結束。

以上來自 這篇博客 具體應用可以繼續看這篇文章

模板

int exgcd(int a,int b,int &x,int &y)
{if(b == 0){x = 1; y = 0; return a;}int d = exgcd(b, a % b,x,y);int temp = x;x = y;y = temp - a / b * y;return d;
}

?快速冪取模

http://blog.csdn.net/hkdgjqr/article/details/5381292

快速冪取模就是在O(logn)內求出a^n mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c

二分遞歸

long exp_mod(long a,long n,long b)
{long t;if(n==0) return 1%b;if(n==1) return a%b;t=exp_mod(a,n/2,b);t=t*t%b;if((n&1)==1) t=t*a%b;return t;
}

基于二進制

LL q_mod(LL a,LL b)
{
LL d,t;
d = 1,t=a;
while(b)
{
if(b&1) d = (d*t)%mod;
b/=2;
t = (t*t)%mod;
}
return d;
}

?http://acm.hdu.edu.cn/showproblem.php?pid=2817

View Code
 1 #include<stdio.h>
 2 #define N 200907
 3 __int64 exp_mod(__int64 a,__int64 b)
 4 {
 5     __int64 d,t;
 6     d = 1;
 7     t = a;
 8     while(b>0)
 9     {
10         if(b%2==1)
11             d = d*t%N;
12         b=b/2;
13         t = t*t%N;
14     }
15     return d;
16 }
17 int main()
18 {
19     __int64 n,m,a1,a2,a3,d,s,x;
20     int i,j,k,t;
21     scanf("%d", &t);
22     while(t--)
23     {
24         scanf("%I64d%I64d%I64d%d",&a1,&a2,&a3,&k);
25         if(a2-a1==a3-a2)
26         {
27             d = a3-a2;
28             s = (a1%N+d*(k-1)%N)%N;
29             printf("%I64d\n",s);
30         }
31         else
32         {
33             x = a3/a2;
34             printf("%I64d\n",(a1*exp_mod(x,k-1))%N);
35         }
36     }
37     return 0;
38 }

?

?

轉載于:https://www.cnblogs.com/shangyu/archive/2012/08/02/2620595.html

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

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

相關文章

匯編語言-002(.data、Equal、$、EQU 、MOV 、MOVSX、MOVZX)

1&#xff1a;變量相加程序 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data firstval DWORD 20002000h secondval DWORD 11111111h thirdval DWORD 22222222h sum DWORD 0.code main PROCmov eax,firstvaladd eax,secondvaladd eax,thirdvalm…

\r與\n的區別,\r\n與\n或\r的區別(C語言/C#)

本文出處http://topic.csdn.net/t/20020718/07/882679.html 原作者:triout&#xff08;笨牛&#xff09; \r表示回車&#xff0c;\n表示換行&#xff0c;我們按回車按鈕的時候&#xff0c;系統自動產生回車和換行兩個字符&#xff1a; 回車僅僅是表示完成&#xff0c;把光…

通過ID查詢一個用戶的兩種開發方法

通過ID查詢一個用戶的兩種開發方法 數據庫建表sql語句如下&#xff1a;https://github.com/beyondyanyu/Sayingyy/blob/master/JDBC2-數據庫sql建表語句 ①&#xff0c;原始Dao開發&#xff1a; UserDao.java&#xff08;接口&#xff09;: package com.pdsu.mybatis.dao;i…

duration java_Java Duration類| minusMinutes()方法與示例

duration java持續時間類minusMinutes()方法 (Duration Class minusMinutes() method) minusMinutes() method is available in java.time package. minusMinutes()方法在java.time包中可用。 minusMinutes() method is used to subtract the given duration in minutes from t…

Silverlight + WCF異步調用 例子

看大家好像對我的NParsing框架不是很感興趣&#xff08;寫NParsing帖沒人頂我&#xff09;&#xff0c;那就給大家來點“甜品”&#xff0c;換換口謂。來說說Silverlight方面的東西。 在Silverlight中數據通信只能用異步。有人會覺得寫起來很麻煩&#xff0c;其實不然。也有很簡…

我博客主頁的搜索功能怎么不好用

用博客里面的搜索功能&#xff0c;“找找看”&#xff0c;搜索我博客里面的關鍵字&#xff0c;但是不能出現結果。但是我在別人的主頁上能夠搜索該人的內容&#xff0c;能夠查詢到記錄&#xff0c;難道博客園對每個博客的信息要先排序&#xff1f;目前我的還不在他的搜索數據庫…

小議SqlMapConfig.xml配置文件

①、mybatis-3-config.dtd 主要用于mybatis的核心配文件sqlMapConfig.xml的約束 sqlMapConfig.xml代碼如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN&q…

ffmepg 命令提取音視頻數據

原文件&#xff1a; 1&#xff1a; 原音頻數據提取&#xff08;保留還是mp4的封裝格式的&#xff09;&#xff1a; ffmpeg -i test_1920x1080.mp4 -acodec copy -vn audio.mp4 -vn 就是沒有視頻&#xff0c; -acodec copy 音頻拷貝不進行任何轉碼 原視頻數據提取&#xff0…

Java BigInteger類| modInverse()方法與示例

BigInteger類modInverse()方法 (BigInteger Class modInverse() method) modInverse() method is available in java.math package. modInverse()方法在java.math包中可用。 modInverse() method is used to calculate the mod inverse by using the inverse of (this BigInteg…

【7】jQuery學習——入門jQuery選擇器之過濾選擇器-可見性過濾選擇器

這篇什么都不說&#xff0c;看標題就知道了&#xff0c;很簡單&#xff0c;就2個選擇器&#xff0c;嘿嘿 選擇器描述返回$("Element:hidden")選取所有不可見的元素集合元素$("Element:visible")選取所有可見元素集合元素這篇很簡單吧&#xff0c;就2個&…

Creating an undraggable TitleWindow container in Flex (轉載)

The following examples show how you can create an undraggable TitleWindow container by setting the isPopUp property to false on the TitleWindow instance. <?xml version"1.0" encoding"utf-8"?><!-- http://blog.flexexamples.com/2…

匯編語言-003(LAHF_SAHF 、XCHG、FLAGS、 OFFSET、ALIGN、PTR、LENGTHOF、SIZEOF)

1&#xff1a;LAHF將EFLAGS符號寄存器低8位字節復制到AH&#xff0c;SAHF將AH復制到EFLAGS符號寄存器低8位字節 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data saveflags BYTE ?.code main PROClahfmov saveflags ,ahmov ah,saveflagssahfIN…

Mybatis中的核心配置文件SqlMapConfig.xml詳細介紹

一、properties&#xff08;屬性&#xff09; 可以引用java屬性文件中的配置信息如下 jdbc.properties代碼如下&#xff1a; jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/mybatis?characterEncodingutf-8 jdbc.usernameroot jdbc.passwordbeyond…

用Kotlin開發您的第一個應用程序| Android與Kotlin

In the previous article, we learned how to setup Kotlin in the android studio? Now moving to journey ahead we are going to develop our first app with Kotlin. It is the basic app, but it will let you know the structure of the program. 在上一篇文章中&#x…

數據結構與算法分析-第一章Java類(02)

編寫一個名為Person的類&#xff0c;它包含分別表示人的名字與年齡的兩個數據域。要求此類包含對其中任何一個數據域進行設置與獲取的方法。還要求包含可進行下列測試的方法&#xff1a; 兩個Person對象是否相等--即是否有相同的名稱與年齡一個人是否比另一個人年長 最后&#…

asp.net對于長篇文章進行分頁

對于文章篇幅比較長的&#xff0c;就必須采用分頁顯示。在.net中對長篇文章分頁一般有2種方法&#xff0c;第一種就是先計算好一頁的文字長度是多少&#xff0c;然后把文章總的長度除設置好的單頁文字長度及可&#xff0c;用這方法可以減少認為進行分頁的繁瑣&#xff0c;但是這…

匯編語言-004(LABEL 、間接尋址、變址操作數、指針使用、TypeDef、LOOP、DWORD變量交換高位低位字)

1&#xff1a; LABEL : 為一個標號定義大小屬性&#xff0c;但不分配內存與下一個變量共用內存&#xff0c;與C中UNION類似 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCoed:DWORD.data val16 LABEL WORD val32 DWORD 12345678hLongValue LABEL DWORD val1…

(只需挨個復制粘貼命令即可部署)在Centos7下搭建文件服務器(VSFTPD)

觀看北京尚學堂-百戰程序員筆記一、VSFTPD簡介 Linux的組件&#xff08;一款軟件&#xff09;&#xff0c;安裝到Linux后可以通過java代碼&#xff08;FtpClient&#xff09;實現文件的上傳。基于FTP協議。 由于VSFTPD是基于FTP協議&#xff0c;客戶端瀏覽器是需要通過http協議…

POJ 2421 Constructing Roads MST kruskal

最近剛學的并查集所以用kruskal來試試最小生成樹~ kruskal其實用幾句話就能說完~ 1.貪心所有邊的權值,從小到大取值 2.取值時~將邊權非0的兩個頂點~進行并查操作~如果兩個點的祖先不同...邊權加入最小生成樹...并且將兩個點納入同一個集合中 3.判斷是否所有點都在同一個集合中…

c# 聲明類的時候初始化類_使用C#初始化的列表聲明

c# 聲明類的時候初始化類The task is to create/declare a list with an initializer list in C#. 任務是在C&#xff03;中使用初始化列表創建/聲明一個列表 。 C&#xff03;清單 (C# List) A list is used to represent the list of the objects, it is represented as Lis…