gcd

day3(数论)

瘦欲@ 提交于 2019-11-27 01:01:51
总 得来说,这是可怕的一天,极其可怕的一天 (完) 一、数论 阴影啊! 首先,设ab为两个整数,则存在唯一的q和r,使得a=qb+r 若r=0,则b整除a,记作b|a。 (1)同余 若a/m和b/m的余数相同,则称a于b对模m同余,记作a ≡ b (mod m) 剩余系:在模 m 的意义下,余数相同的数归为一个集合,那么所有整数被分为 m个不同的集合,模 m 的余数分别为 0,1,2,3,...,m − 1,这些集合被称为模 m 剩余类(同余类)。每个同余类中的任意两个整数都是模 m 同余的。__by dzy(就是模m的余数集合) 若是剩余系遍历了0~m-1,则叫做完全剩余系 同余式的三则运算: 设 a,b,c,d 为整数,m 为正整数,若 a ≡ b (mod m),c ≡ d(mod m),则: ax + cy ≡ bx + dy (mod m),其中 x,y 为任意整数,即同余式可以相加() ac ≡ bd (mod m),即同余式可以相乘a n ≡ b n (mod m),其中 n > 0 f(a) ≡ f(b) (mod m),其中 f(x) 为任一多项式。 a n ≡ b n (mod m),其中 n > 0 (2)素数 判断素数的方法:一般是从2开始,枚举到√ n,依次判断i是否能整除n,若n=pq,则pq中的一个必定小于等于√ n。 但是,如果硬生生跑√ n

【数论】GCD与LCM

南楼画角 提交于 2019-11-27 00:33:09
目录 gcd的欧几里得算法 gcd的二进制算法 最小公倍数lcm gcd的欧几里得算法 又称辗转相除法,是一个求解两数最大公因数的算法。算法可以用递推式 \(gcd(a,b)=gcd(b, {a}\mod{b})\) 概括,边界条件是 \(gcd(a,0)=a\) 。代码如下(相信每个OIer都会): int gcd(int a,int b){ //递归形式 return b==0?a:gcd(b,a%b); } int gcd(int a,int b){ //迭代形式 int t; while(b){ t=a%b;a=b;b=t; } return a; } 可以大致估计出,这个算法的复杂度是 \(O(logb)\) 的,因此无需担心栈溢出问题。下面给出算法的分析证明(略长可跳过)。 首先设 \(a=r_0,b=r_1\) ,根据递推式,我们列出递推过程: \(r_0=q_0\cdot r_1+r_2\) \(r_1=q_1\cdot r_2+r_3\) \(r_2=q_2\cdot r_3+r_4\) \(......\) \(r_{n-3}=q_{n-3}\cdot r_{n-2}+r_{n-1}\) \(r_{n-2}=q_{n-3}\cdot r_{n-1}+r_{n}\) \(r_{n-1}=q_{n-1}\cdot r_{n}+0\) 可以概括为 \(r_{i-2}

UVA11388 GCD LCM

拥有回忆 提交于 2019-11-26 20:38:39
( 链接点这儿 ) 题目: The GCD of two positive integers is the largest integer that divides both the integers without any remainder. The LCM of two positive integers is the smallest positive integer that is divisible by both the integers. A positive integer can be the GCD of many pairs of numbers. Similarly, it can be the LCM of many pairs of numbers. In this problem, you will be given two positive integers. You have to output a pair of numbers whose GCD is the first number and LCM is the second number. Input The first line of input will consist of a positive integer T. T denotes the number of cases.

用GCD来处理大量for loop任务

瘦欲@ 提交于 2019-11-26 18:29:18
在编程过程中,我们经常会用到for循环,而且for循环要做很多相关的任务。比如: for (i = 0 ; i < count; i++ ) { // do a lot of work here. doSomething(i); } 如果for循环中处理的任务是可并发的,显然放到一个线程中处理是很慢的,GCD提供两个函数dispatch_apply和dispatch_apply_f,dispatch_apply是用于Block的,而dispatch_apply_f可以用于c函数,它们可以替代可并发的for循环,来并行的运行而提高执行效率。 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ); dispatch_apply(count, queue, ^ (size_t i) { // do a lot of work here. doSomething(i); }); 转载于:https://www.cnblogs.com/mystory/p/3467522.html 来源: https://blog.csdn.net/weixin_30807677/article/details/99019330

扩展欧几里得算法

丶灬走出姿态 提交于 2019-11-26 17:53:30
拓展欧几里得算法 先来看看一个重要的基本定理 裴蜀定理 对于整数a,b,他们关于x,y的线性不定方程 \(ax+by=d\) ,设 \(gcd(a,b)=g\) ,则可证明 \(g|d\) ,换句话说,就是 g是a,b的最小线性组合 。 证明: 设 \(ax+by=d\) , \(g=gcd(a,b)\) ,设 \(ax+by\) 的最小值为s, \(\because\) \(g|a,g|b\) \(\therefore\) \(g|d\) , \(g|s\) 设 \(q=[\frac{a}{s}].则r= a\mod s=a-q*s=a-q*(ax+by)=a(1-qx)+b(-qy)\) 。 可见r也是x,y的线性组合,又r是s的余数, \(r\in [0,s-1]\) ,又s是最小线性组合, \(\therefore r=0\) 。 推出 \(s|a\) ,同理有 \(s|b\) ,则 \(s|g\) ,又已经有 \(g|s\) ,所以 \(g=s\) 。可知g是ax+by的最小线性组合。 推论: a和b互质的充要条件是存在x,y使 \(ax+by=1\) ,因为由上面的证明结论知道d(这里是1)一定是gcd(a,b)的倍数。 其实还可以推广到一堆数互质(这些数的gcd为1)的情况。 拓展欧几里得 我们知道,一般的 欧几里得算法是来求两个数的最大公因数的

iOS面试题总结

点点圈 提交于 2019-11-26 17:18:50
1. 多线程的底层实现? 1. 首先搞清楚什么是线程、什么是多线程 2. Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程 3. 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的 4. 开发中实现多线程的方案 C语言的POSIX接口:#include <pthread.h> OC的NSThread C语言的GCD接口(性能最好,代码更精简) OC的NSOperation和NSOperationQueue(基于GCD) 2. 线程间怎么通信? 1. performSelector:onThread:withObject:waitUntilDone: 2. NSMachPort 3. 网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题? 利用字典(图片地址为key,下载操作为value),具体可以查看SD缓存机制 4. 用NSOpertion和NSOpertionQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做? NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSOperation *A = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@

通过扩欧得出线性同余方程的通解以及x的最小正整数解

ぃ、小莉子 提交于 2019-11-26 15:55:19
同余定理 若 ax与b模m的余数相同(其中x为未知数,即所需要求的数),即 ax%m=b%m ,则这个式子可以记作成 a≡b (mod m) 。 设ax对m取模后的余数为r1,则有: ax=y1 m+r1。 ① 同理,设b对m取模后的余数为r2,则有: b=y2 m+r2。 ② 其中y1与y2均为任意整数,此时两则互不相干。 那么我们知道,由于ax%m=b%m,则 r1=r2 ,联立①②得:ax-y1 m=b-y2 m,移项最后得出方程: ax+my=b 这个方程叫 线性同余方程 ,由于未知数x为一阶的,所以也称为 一次同余方程。 这个方程的形式也使它叫作 不定方程。 这个方程的一个性质是:若至少有一组解(x0,y0)能使得这个方程成立,则当且仅当gcd(a,m)|b, 即a与m的最大公约数能被b整除。 (裴蜀定理) 如果我们直接求解的话,当然是不行的了~那么接下来会由扩展欧几里得算法来求出这个方程的通解。 在接下来之前,我们有牢记一个东西,方程ax+my=b,它是关于(x,y)的一个二元一次方程,切记它的 右半边式子是已知的数b。 (一般题目推出来,a、b、m都是已知的。求x,y) 设g=gcd(a,m), 而扩展欧几里得算法只是求方程:ax+my=g的一组特解。 扩展欧几里得算法 对于方程: ax+my=g ,用ex_gcd(扩欧)求出一组解(x0,y0)满足这个方程。

CF#511-C Enlarge GCD(gcd)

泪湿孤枕 提交于 2019-11-26 12:36:51
题意:给你一个序列,然后求删除几个数之后整个序列的最大公约数增大 思路:我们首先要求出这个公共的gcd,然后要使gcd增大我们可以尝试对增加gcd并判断是否为存在某个数为该数的gcd 同时统计个数,为公共gcd最大的即为最后所求的值。(增加上限就是到最大的那个数) 范围为1~1e5,arr[i]为1.5e7 完整代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; int arr[maxn]; int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int main(){ int n; while(cin>>n){ for(int i =0 ;i<n;i++){ cin>>arr[i]; } sort(arr,arr+n); int g = arr[0]; for(int i = 1;i<n;i++){ g = gcd(arr[i],g); } int ans = 0; int cont; for(int j = g;j<=arr[n-1];j++){ cont = 0; for(int k = 0;k<n;k++){ if(arr[i]%g)

简单数学

醉酒当歌 提交于 2019-11-26 09:07:46
目录 简单数学 欧几里得算法 例题 扩展欧几里得算法 求线性同余方程 求线性同余方程的最小解 好像之前写过了,不过老师让写笔记就有写了一遍 简单数学 声明本文是用笔记本电脑的键盘写的误触的几率非常大所以可能会出现奇怪的问题 欧几里得算法 求两数的最大公约数,证明我不会就不写了 int gcd(int a, int b){ return b == 0? a : gcd(b, a % b); } 例题 UVA12716GCD等于XOR GCD XOR 异或的性质 1.若$a xor b=c$则$a xor c=b$ 2.$a-b<=a xor b (a>=b)$ 设$a=k_1 c,b=k_2 c$ 则$a-b=(k_1-k_2)*c$ 则$a-b>=c$ 因为上述性质2 所以$a-b<=c$ 所以只要枚举$a$和$c$,计算$b=a-c$,则$gcd(a,b)=gcd(a,a-c)=c$ 再验证是否有$c = a xor b$即可,时间复杂度为$O(nlogn)$. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<string> #include