gcd

csp-s模拟测试70

拈花ヽ惹草 提交于 2019-12-01 06:40:11
发现不码题解还是记不清题。 A. 木板 枚举$y_E$,求出$x_F$关于$y_E$的式子,设$y_E$为$x$,发现$Ans=\sum\limits_{x=1}^{n-1} [n|x^2]$ 考场上受《神炎皇》启发,提出$gcd$,设$gcd(x,n)=d$ $n'd|x'^2d^2$ $n'|x'^2d$ 又因为$gcd(n',x')=1$ 所以$gcd(n',x'^2)=1$ 就有$n'|d$ 设$kn'=d$ 联立$n'd=n$ 得$kn'^2=n$ 所以有$n' \leq \sqrt n$ 这就允许我们枚举$n'$了 对于同一个$n'$和$d$,只需求出有多少$x'$ 知$x' < n'$且$gcd(x',n')=1$ 那么$x'$的个数为$\varphi (n')$ 证明下$x$不会重复: $x=x'd$ $x=\frac {x'n} {n'}$ n是常量,又因为$gcd(x',n')=1$,求出x互不相同。 $Ans=\sum\limits_{n'=1}^{\sqrt n} [n'|n][n'|\frac {n}{n'}] \varphi (n')$ 然而考场上,d%i写成i%d,边调边证明(以为有瑕疵)到考试结束。。。 B. 打扫卫生 来源: https://www.cnblogs.com/hzoi-yzh/p/11664733.html

Codeforces Gym 102361A Angle Beats CCPC2019秦皇岛A题 题解

对着背影说爱祢 提交于 2019-12-01 06:18:08
题目链接 : https://codeforces.com/gym/102361/problem/A 题意 :给定二维平面上的 \(n\) 个点, \(q\) 次询问,每次加入一个点,询问平面上有几个包含该点的直角三角形。 分析 :这是一篇鸽了很久的题解,主要原因就是现场赛的时候这题惨遭卡常,锅++。现在回过头来想这题,主要问题出在现场赛时误判了 \(map\) 的时间复杂度,把极角排序的正确想法成功叉掉,以及现场赛时候的共线计数使用了 \(gcd\) ,使得整体复杂度上升。(但还是有大佬拿gcd思想过了,我太菜了)现在学了一种共线计数的新想法,只需要重载就能实现,于是再用 \(map\) 来写一写这道题。。。 本题思路不难,将直角三角形分为两类,一类是以新加入点为直角顶点的直角三角形,另一类新加入点不作直角顶点。第一种情况,我们将新加入点与原有点之间构成的所有向量加入 \(map\) ,然后通过点积为零的性质查找垂直的向量个数。(会计数两次,要除以二)另一类采取离线操作,我们将每个原有点当作直角顶点遍历,并将该点与另外原有点构成的向量加入 \(map\) ,更新 \(q\) 个新加入点的直角三角形数量即可。 AC代码 : #pragma GCC target("avx") #pragma GCC optimize(3) #pragma GCC optimize("Ofast")

数学专题——学习笔记

北战南征 提交于 2019-12-01 05:23:17
目录 数论 扩展欧几里得 乘法逆元 1.费马小定理(最好写) 2.扩展欧几里得 3.递推 (扩展)中国剩余定理 (扩展)卢卡斯定理 莫比乌斯反演 杜教筛 函数 快速傅里叶变换(Fast Fourier Transformation) 快速数论变换(Number Theoretic Transforms) 快速沃尔什变换(Fast Walsh Transform) 矩阵 矩阵乘法及快速幂 矩阵加速 计算几何(没学) @(这里是对学过的数学相关算法的总结) 数论 扩展欧几里得 ta用于解二元一次不定方程: \[a*x+b*y=c\] 我们先考虑解这个方程: \[a*x+b*y=gcd(a,b)\] 如果 \(gcd(a,b)|c\) ,那么方程有解,否则无解 怎么解呢? 既然 \[a*x+b*y=gcd(a,b)\] 成立,那么易证下面这个式子也应该成立: \[b*x_1+(a\%b)*y_1=gcd(a,b)\] 接下来可以一直迭代,直到 \(b_n=0\) ,这时不难发现: \[a_n=gcd(a,b)\] 于是我们找到了一组特殊解: \[x_n=1,y_n=0\] 这时我们要做的是以这组特殊解倒推上一组方程的一组解。 由开始的两个式子可以做一些特殊的变化: \[a*x+b*y=gcd(a,b)\] \[b*x_1+(a\%b)*y_1=gcd(a,b)\] \(→\) \[a*x

csp-s67总结

本秂侑毒 提交于 2019-12-01 02:54:33
问题总结 前两道题一开始方向走错,无脑开想。 T2打两维导致不会优化 T1没有看出gcd的性质 T3没有打暴力 心态也有问题时间分配仍不均匀 T1 性质题推式子 发现原式子无法进行优化考虑式子成立的前提条件 推条件 gcd(a,b)!=1, 由辗转相减知gcd(a+b,b)=gcd(b,a)=1,gcd(a+b,a)=gcd(a,b)=1 - > gcd(a,b)=1,则gcd(a+b,ab)=1; 拆式子 设gcd(a,b)=x,a=nx,b=mx,则(a+b)=(n+m)x|nmx^2, 即 n+m|nmx, 由于gcd(a,b)=x,所以gcd(n,m)=1,由上述条件知gcd(n+m,nm)=1, 所以(n+m)|x。 想优化及含义 n+m|x,考虑这个式子能如何用来优化,一个不够上两个 n+m|x,x*(n+m)<=n,而要满足n+m|x -> x>=n+m 则推出n+m<=sqrt(n),n<=1e14,考虑枚举n+m算出答案 对于a+b=(n+m)*x,对于枚举的n+m找出合法的x即可,x合法需满足n+m|x,x*(n+m)<=n 即 x<=n/(n+m),n+m|x, 所以枚举i=n+m,x<=n/i,又因为n+m|x,对于取值范围内的x每i个合法一个总共n/i/i个 继续考虑i=n+m,合法的n,m可以有多少个这是只要满足n+m>1,n+m<=n,gcd(n,m)

[CSP-S模拟测试67]题解

喜你入骨 提交于 2019-12-01 02:37:34
时隔多年,终于又有了一套我能改完的题…… A.神炎皇 遇到这种要求整除的题显然拆出gcd 设$d=gcd(a,b)\ \ \ a'=\frac{a}{d} \ \ \ b'=\frac{b}{d}$ 原式转化为$a'd+b'd|a'db'd$ $a'+b'|a'b'd$ 又因为$gcd(a',d')=1$ 所以$a'+b'$一定不是$a'b'$的因子,进而得到$(a'+b')|d$ 又由$a+b \leq n \rightarrow (a'+b')d \leq n \rightarrow a'+b' \leq \sqrt{n}$ 不妨枚举$s=a'+b'$ 那么满足$gcd(a',b')=1$的合法数对有多少个? 由更相减损术可得$gcd(a,b)=gcd(a+b,b)$ 所以$a',b'$共$\varphi (s)$对 那合法的$d$也就只有$\frac{n}{s^2}$个 答案即$\sum \limits _{i=2}{n} \varphi (i) \times \frac{n}{i^2}$ 注意到当$i> \sqrt{n}$时每项为0,所以枚举到$\sqrt{n}$即可 复杂度$O(\sqrt{n})$。 来源: https://www.cnblogs.com/Rorschach-XR/p/11648624.html

神盐皇

余生长醉 提交于 2019-12-01 02:27:49
终于会了 先放一个 极好的博客 求满足$a+b|a*b,\&a<=n,b<=n$数对数量,$n<=10^{15}$ 设$d=gcd(a,b)$ 那么$a_1=\frac{a}{d},,b_1=\frac{b}{d}$ 原要求变为$(a_1+b_1)*d|a_1*b_1*d*d$即$(a_1+b_1)|a_1*b_1*d$ 考虑辗转相减法转化$gcd(a_1,b_1)==1$->$gcd(a_1+b_1,b_1)==1$->$gcd(a_1+b_1,a_1)==1$ $a_1+b_1$与$b_1$无公因数,与$a_1$无公因数$gcd(a_1+b_1,a_1*b_1)==1$ 原式变为求$(a_1+b_1)|d$个数 $i=a_1+b_1$设$d=k*i$ $d*i<=n$故$k$共$\large \lfloor \frac {n}{i*i} \rfloor$个 考虑$i$的取值情况, 现在要求$gcd(x-i,i)==1$数个数 仍然考虑辗转相减$gcd(x,i)==1$个数,确定,$x<=i$,那么就是$\varphi(i)$ $\sum_{i=1}^{\sqrt n}\varphi(i)\lfloor\frac{n}{i^2}\rfloor$ 然后关于$\varphi(i)$求法 我又忘了$\varphi(i)$线筛怎么求了,重新理解了一遍 首先计算式$\varphi(N)=N

数学总结

房东的猫 提交于 2019-11-30 23:06:22
主要整理一下 noip csp的数学 版权声明,大部分摘抄于《信息学奥赛之数学一本通》 如有侵权行为,本文作者将删除 持续更新ing 1.1辗转相除法 辗转相除法用来求两个数的最大公约数,又称欧几里得算法,其原理是:GCD(x,y)=GCD(x,y-x); 代码实现 int GCD(int x,int y){ if(y==0) return x; else return GCD(y,x%y); } 1.2最小公倍数LCM 定理:a,b两个数的最大公约数乘以它们的最小公倍数等于两数相乘 1.3扩展欧几里得算法 用来在已知(a,b)时,求解一组(p,q),使得p * a + q * b = GCD(a,b) 根据欧几里得算法可得,a和b都在减小,当b减小到0时,就可以得出p=1,q=0.然后递归回去就可以求出最终的p和q了。 代码实现 #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int exgcd(int a,int b,int &x,int &y){//加上&会改变下方调用x,y的值 int ret,tmp; if(!b){ x=1; y=0; return a; } ret=exgcd(b,a%b,x,y)

模拟65 题解

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-30 21:23:19
A. Simple 首先求出n,m的gcd,那么显然只有gcd的倍数可能被拼出,其他数一定是不好的数。 所以问题转化为用$\frac{n}{gcd}$,$\frac{m}{gcd}$,拼不出的$\frac{q}{gcd}$范围内的数。 因为除gcd后的n,m互质, 用某凯的疑惑中的结论可知最大的拼不出的数是$n*m-n-m$。 所以给$n*m-n-m$不断减掉n或m,一定仍然为拼不出的数。 然后就可以发现,题目中给出n的范围恰好不大。 所以给上述的数不断减m,并除n求出有多少个数就可以了。 B. Walk 打了一个非常奇怪的点分治,大概是利用了对一条边取gcd之后的不同值不会有太多。 开了很多个vector,并暴力扫vector更新答案,随机极限数据跑不到1s,得到了70分。 正解利用了边权的因数个数不超过根号级别。 所以枚举答案的大小,并只将边权有该因数的边建出来。 于是问题转化为了求建边形成的森林中最大的树的直径,直接dfs就可以了。 C. Travel 将问题中的相邻点作为一条线段。 首先考虑起点为1,终点为n的答案。 那么每条线段都会覆盖至少一次, 因为要向左跳,至少L条线段上的路径是-->,<--,-->,会覆盖至少三次。 并且存在一种方案构造出L条线段覆盖三次。 取得最小的L条线段,就可以累计答案。 当起点和终点并不为端点,不妨设$1<s<t<n$。

csp-s 65 Simple

我的梦境 提交于 2019-11-30 20:42:49
最近的性质题都垮掉了 nx+my=c,x,y非负整数 求1-q内有多少个c满足 q<=1e18 60% exgcd 但别深陷其中,性质还是要找 考虑枚举x或y那么有c-m=nx,c-2*m=nx,的形式 因为n,m均为正整数,所以在c-m>=0,c-2*m>=0 下 (c-m)%n==0 ,(c-2*m)%n==0 一定有合法x解 全部枚举的话复杂度过高且有重复问题 考虑如何避免重复:对于每一个确定的c有唯一确定的最小整数解 所以只要枚举最小x/y的整数解即可 考虑其范围:用到了exgcd的通解公式: x=x0+num*m/(gcd(n,m)),y=y0+num*n/(gcd(n,m)), 最小整数解是x%(m/(gcd(n,m))) y%( n/gcd(n,m) ); 分别对应范围0-m/gcd(n,m)-1, 0-n/(gcd(n,m))-1; m1e9, n1e5所以枚举y的最小整数解那么每一个合法的c都在唯一的一个y中对应着唯一一个x 所以ans+=(q-i*m)/n+1即可算出合法解的个数 +1是因为0的存在 由于枚举了Y=0,的情况所以这时+1表示了x=0,y=0, ->c=0不合法 所以答案是q-ans+1; 来源: https://www.cnblogs.com/three-D/p/11639282.html

[算法笔记] 扩展欧几里得算法

允我心安 提交于 2019-11-30 19:52:25
1. 扩展欧几里得算法 扩展欧几里得算法用于求解这样一个问题: 给定两个非零整数 \(a\) 和 \(b\) ,求一组整数解 \((x,y)\) 使得 \(ax+by = gcd(a,b)\) 成立。 易知: \[ ax+by = gcd(a,b) = gcd(b,a\%b) = ... = gcd(a',0) = a' \\ a'x+0y = gcd(a',0) = a' => x=1 \] 下面说明求解过程。 \[ \begin{aligned} gcd(a,b) &= gcd(a,a\%b) \\ ax+by &= gcd(a,b) \end{aligned} \] 所以设: \[ \begin{aligned} ax_1+by_1 &= gcd(a,b) \\ bx_2+(a\%b)y_2 &= gcd(b,a\%b) \end{aligned} \] 因此有: \[ bx_2+(a\%b)y_2 = ax_1+by_1 \] 又因为( / 表示整除): \[ a\%b = a - (a/b)*b \] 所以: \[ \begin{aligned} bx_2+(a - (a/b)*b)y_2 &= ax_1+by_1 \\ ay_2+b(x_2 - (a/b)y_2) &= ax_1+by_1 \end{aligned} \] 所以: \[ \begin{aligned}