gcd

hdu 2669 Romantic 扩展欧几里德

大城市里の小女人 提交于 2019-12-30 04:41:00
利用扩展欧几里德算法可以解方程ax+by=c. 当使用扩展欧几里德算法时,当x+b时,y-a。 欧几里德算法 定理:gcd(a,b) = gcd(b,a mod 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)的公约数是一样的,其最大公约数也必然相等,得证 。 其算法:(a为任意非负整数,b为任意正整数) /* * hdu2669.c * * Created on: 2011-9-13 * Author: bjfuwangzhu */#include<stdio.h>int x, y;int extend_gcd(int a, int b) { if (b == 0) { x = 1, y = 0; return a; } int d = extend_gcd(b, a % b); int tx = x; x = y, y = tx - a / b * y; return d;}int main() {#ifndef ONLINE_JUDGE freopen("data

AcWing 872 最大公约数

故事扮演 提交于 2019-12-25 00:31:51
题目描述: 给定n对正整数ai,bi,请你求出每对数的最大公约数。 输入格式 第一行包含整数n。接下来n行,每行包含一个整数对ai,bi。 输出格式 输出共n行,每行输出一个整数对的最大公约数。 数据范围 1≤n≤10^5,1≤ai,bi≤2∗10^9 输入样例: 2 3 6 4 6 输出样例: 3 2 分析: 求gcd(a,b)一般使用欧几里得算法(辗转相除法),当然也可以采用其他办法比如更相减损术。 欧几里得算法的核心是gcd(a,b) = gcd(b,a%b)。已知c | a,c | b,则可以得到c | (xa +yb),又a % b = a - kb,令c = gcd(a,b),x=1,y=-k,就得到了c | (a - kb),即c | (a % b)。那么知道了c是b和a % b的公约数,如何证明c是最大公约数呢,很简单,加上b和a % b存在更大的公约数d,则d | (a % b + a / b * b),即d | a,如此d就是a和b的公约数了,这与c=gcd(a,b)是矛盾的,故c也是b和a % b的最大公约数。 #include <iostream> using namespace std; int gcd(int a,int b){ return b ? gcd(b,a % b) : a; } int main(){ int n,a,b; scanf("%d

训练心得12.22

老子叫甜甜 提交于 2019-12-23 00:48:25
之前做了一下vjudge数论模块,做一下总结 1、素数筛法,用来筛各种积性函数 2、 s ( p n ) = 1 + p + p 2 + . . . + p n s(p^{n})=1+p+p^2+...+p^n s ( p n ) = 1 + p + p 2 + . . . + p n ,运用等比数列求和,得 s ( p n ) = ( p n + 1 − 1 ) p − 1 s(p^n)=\frac{(p^{n+1}-1)}{p-1} s ( p n ) = p − 1 ( p n + 1 − 1 ) ​ 3、找周期,找到周期 T T T 之后就可以对 T T T 取模 4、 g c d ( a m − 1 , a n − 1 ) = a g c d ( m , n ) − 1 gcd(a^{m-1},a^{n-1}) = a^{gcd(m,n)}-1 g c d ( a m − 1 , a n − 1 ) = a g c d ( m , n ) − 1 ,推广: 若 g c d ( a , b ) = 1 gcd(a,b)=1 g c d ( a , b ) = 1 则 g c d ( a m − b m , a n − b n ) = a g c d ( m , n ) − b g c d ( m , n ) gcd(a^m-b^m,a^n-b^n) = a^{gcd(m,n

GCD 初步学习

谁说我不能喝 提交于 2019-12-17 20:14:18
GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好。 在cocoa-china上面有两篇关于GCD的文章。 GCD 深入理解(一) GCD 深入理解(二) CSDN荣芳志博客: 点击打开链接 我仅仅是读了第一篇文章,在这对里面讲的几个操作函数做一下记录: GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。 原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行; 串行队列-队列中的任务是串行的。执行完一个后接着执行下一个。可是队列与队列之间是并行的 并行队列-队列中的任务是并行的。所以结束的顺序不确定。 系统提供了四个全局 并发队列 有不同的优先级 background、low、default 以及 high #define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 系统还提供给你一个叫做主队列的特殊队列。是一个 串行队列 ,主要用与UI更新。 经常用法: 我们自己能够来创建队列 <span style="font-family:SimSun

洛谷 P5535 【XR-3】小道消息

二次信任 提交于 2019-12-12 19:31:56
https://www.luogu.com.cn/problem/P5535 伯特兰-切比雪夫定理: 若整数n > 3,则至少存在一个质数p,符合n < p < 2n − 2。 另一个稍弱说法是:对于所有大于1的整数n,至少存在一个质数p,符合n < p < 2n。 若k+1是质数,且 (k+1)*2>n+1 则所有人在第1天知道消息 若k+1是质数,但(k+1)*2<=n+1,第1天之后数字为k+1的倍数的人不知道消息,相邻两个数的gcd一定为1,所以这些人在第2天会知道消息。 若k+1不是质数,由伯特兰-切比雪夫定理,在(2,4)(3,6)(4,8)…… 区间内至少存在1个质数,所以是2天 #include<cstdio> #include<cmath> using namespace std; bool prime(long long k) { int m=sqrt(k); for(int i=2;i<=m;i++) if(!(k%i)) return false; return true; } int main() { long long n,k; scanf("%lld%lld",&n,&k); n++; k++; if(n>>1<k && prime(k)) printf("1"); else printf("2"); } 题目描述 小 X

GCD使用经验与技巧浅谈

孤街醉人 提交于 2019-12-10 11:07:40
前言 GCD(Grand Central Dispatch)可以说是Mac、iOS开发中的一大“利器”,本文就总结一些有关使用GCD的经验与技巧。 dispatch_once_t必须是全局或static变量 这一条算是“老生常谈”了,但我认为还是有必要强调一次,毕竟非全局或非static的dispatch_once_t变量在使用时会导致非常不好排查的bug,正确的如下: 1 2 3 4 5 //静态变量,保证只有一份实例,才能确保只执行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //单例代码 }); 其实就是保证 dispatch_once_t 只有一份实例。 dispatch_queue_create的第二个参数 dispatch_queue_create ,创建队列用的,它的参数只有两个,原型如下: 1 dispatch_queue_t dispatch_queue_create ( const char *label, dispatch_queue_attr_t attr ); 在网上的大部分教程里(甚至Apple自己的文档里),都是这么创建串行队列的: 1 dispatch_queue_t queue = dispatch_queue_create("com.example

漫谈多线程:GCD(一)

流过昼夜 提交于 2019-12-10 08:53:43
导言 多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西。同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂。如果使用过程中对多线程不够熟悉,很可能会埋下一些难以预料的坑。 iOS中的多线程技术主要有NSThread, GCD和NSOperation。他们的封装层次依次递增,其中: 1)NSThread封装性最差,最偏向于底层,主要基于thread使用 2)GCD是基于C的API,直接使用比较方便,主要基于task使用 3)NSOperation是基于GCD封装的NSObject对象,对于复杂的多线程项目使用比较方便,主要基于队列使用 上篇文章介绍了NSThread的用法,NSThread已经属于古董级别的东西了,欣赏一下可以,真正使用就不要麻烦他了。GCD是多线程中的新贵,比起NSThread更加强大,也更容易使用。由于GCD的东西比较多,我会分好几篇文章介绍,这篇文章主要介绍GCD中的queue相关知识。 dispatch_queue_t 使用GCD之后,你可以不用再浪费精力去关注线程,GCD会帮你管理好一切。你只需要想清楚任务的执行方法(同步还是异步)和队列的运行方式(串行还是并行)即可。 任务是一个比较抽象的概念,表示一段用来执行的代码,他对应到代码里就是一个block或者一个函数。 队列分为串行队列和并行队列: 1

概述IOS多线程

妖精的绣舞 提交于 2019-12-10 08:36:06
     在了解多线程之前,我们需要先认识一下什么是 进程 和 线程 。 **进程:**是在系统中运行的一个程序,每个进程之间是独立的,每个进程均运行在其专有且受保护的内存空间内。 **线程:**一个进程想要执行任务,必须得有线程(至少一个线程),线程是进程的基本执行单元,一个进程的所有任务都必须在线程中执行。 **线程的串行:**一个线程中任务的执行是串行的,如果要在一个线程中执行多个任务,只能一个一个的按顺序执行。      那么如何多个任务同时进行?这 便引出了我们的多线程! 一、多线程 ###1.基本概念      一个进程中可以开启多个线程,每个线程可以并发/并行执行不同的任务,多线程可以提交程序的执行效率。如下图(同时执行任务ABC): ###2.多线程的原理      同一时间,CPU只能执行一个线程,只有一个线程正在执行,多线程并发执行,其实是CPU快速的在多个线程之间切换。如果CPU的切换线程的时间足够快,就会造成多线程并发执行的假象。 ###3.多线程的优缺点 **优点: **(1)能适当的提高程序的执行效率         (2)能适当的提高资源的利用率(CPU,内存) 缺点: (1)开启线程会占用一定的内存空间(主线程1M,子线程0.5M),如果开启过多的线程会占用大量的内存空间,降低程序的性能。        (2)线程越多,CPU在调度线程上的开销就越大

一篇专题让你秒懂GCD死锁问题!

房东的猫 提交于 2019-12-10 08:20:50
故事背景: GCD的死锁问题,一直是在使用多线程的时候,一个比较绕也必须要注意的问题,今天在工作中我们几个同事又讨论到了这个话题,通过和大伙的交流,发现不少的同事还是有绕不明白的地方, 我就想到,要不我来写一个关于GCD死锁的专题好了,于是就有了这篇关于GCD死锁的专题: (下方的理解,仅限于我个人的理解,有不妥的地方,望大家斧正!) 如果您有任何意见或建议也可以通过 邮件 或 微博 联系我 环境信息: Mac OS X 10.11.3 Xcode 7.2 iOS 9.2 阐述: ####1. 什么是GCD ? GCD,全称 Grand Central Dispatch。可翻译为”牛逼的中枢调度器”。它是纯C语言的,提供了非常多强大的函数。 Grand是宏伟的、极重要的意思。 GCD是提供了功能强大的任务和队列控制功能,相比于NSOperation更加底层,虽然现象苹果极力的推荐使用NSOperation来解决多线程问题, 但是,就目前市场上大部分企业的iOS开发团队而言, GCD仍然还是大头, NSOperation也只会逐步的来替代GCD, 因此在开线程的时候,如果不注意也会导致一些问题, 比如死锁。 ####2.什么是GCD死锁 ? 所谓死锁,通常指有两个线程A和B都卡住了,A在等B ,B在等A,相互等待对方完成某些操作。A不能完成是因为它在等待B完成。但B也不能完成

关于求原根的方法及其证明

陌路散爱 提交于 2019-12-09 19:04:59
时隔两三个月重新打$ntt$的时候,已经忘记了常见模数的原根。 想要回忆原根的求法,以备不时之需,然而也忘记了。 所以颓了大神$yxs$的证明博客,为了防止再次遗忘,来复读一遍大神的做法和证明。 做法: 因为原根往往很小,所以可以采用暴力枚举的方法。 然而直接暴力$check$的复杂度并不是合法的。 一个可行的$check$方法: 对$\varphi(p)$质因数分解,得到$y_i=\frac{\varphi(p)}{p_i}$ 设当前$check$的数为$x$ 对每个$y_i$,快速幂求出$x^{y_i}$,若均不为$1$,那么$x$为$p$的一个原根。 证明: 若$x^i \equiv 1$ $(mod\ p)$,有 $x^{i*k} \equiv 1$ $(mod\ p)$。 若存在$x^k \equiv 1$ $(mod\ p)$ $(0<k<\varphi(p))$,$x$一定不为原根,所以该做法具有必要性。 下面通过反证证明充分性。 设存在 $x^k \equiv 1$ $(mod\ p)$ 其中$k$不被任意$y_i$整除。 一定存在一组$u,v$满足$u*k+v*\varphi(p)=gcd(k,\varphi(p))$。 有$u*k=gcd(k,\varphi(p))-v*\varphi(p)$。 因为 $x^{u*k} \equiv 1$ $(mod\ p)$,