(扩展)欧几里德快速幂

 

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.mzph.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…