数论
ddgo
给我高高飞起来啊!(ACM退役,转JAVA后端了)
展开
-
sum A^B 等比数列求和(log(k))
题目地址 -> 一个方法,因为mod捕食不是质数。poj 1845 -> 两个方法都可以 还有一个求逆元的解法参考以前博客先化等比数列: 设 sum = (1+q+…+qc)假设 c为奇数, 则可以得到 sum = (1+q+…+q(c/2)+q((c+1)/2)+…+qc)则为sum = (1+q+…+q(c/2)+q((c+1)/2)*(1+q+…+q(c/2)))sum = (1+q((c+1)/2)) * (1+q+…+q(c/2))当 c 为偶数时,同理, sum = (原创 2020-11-05 18:04:32 · 563 阅读 · 0 评论 -
涂颜色(欧拉定理 + 大数模拟取模)
每一行只有两种情况,与列无关,所以答案时2n2^n2n因为n很大很大,所以由欧拉定理 当a与mod互质时 aba^bab(模 mod) = ab模phi(mod)a^{b 模 phi(mod)}ab模phi(mod) (模 mod)= ab(模mod−1)a^{b(模 mod-1)}ab(模mod−1)(模 mod) , 数组模拟去模,把 n 给缩小。最后快速幂就行了。数的四则运算取模证明:设 a = mp + r1 , b = np + r2.(a+b)%p = (a%p+b%p) % pa原创 2020-10-22 21:12:06 · 256 阅读 · 0 评论 -
奶牛卧室(同余)
题目地址1: a1a_1a1 = b1b_1b1 (modk)\pmod{k}(modk)2 : a2a_2a2 = b2b_2b2 (modk)\pmod{k}(modk)即 a1a_1a1 - a2a_2a2 = b1b_1b1 - b2b_2b2 (modk)\pmod{k}(modk)当b1等于b2时是错误的,即 a1a_1a1 - a2a_2a2 = 0 (modk)\pmod{k}(modk)故 a1a_1a1 - a2a_2a2 的所有因子都能满足标记出所原创 2020-09-27 20:30:41 · 182 阅读 · 0 评论 -
Euclid‘s Game (更相减损术理解)
题目地址题意:从已经得到的集合里面选取任意两个数,得到的差是以前没出现过的正数,求出集合的最大个数就可以判断对错。gcd(a,b) = gcd(b,a-b) = gcd(a,a-b) = x可以知道,所有类似于(a-b)这种两个数的差值,一定是x的倍数。所以结合里面的元素全是x的倍数,只需求出有多少个。n = max(a,b)/(__gcd(a,b)) - 2.代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);原创 2020-09-11 15:37:03 · 351 阅读 · 1 评论 -
acwing 213 古代猪文(lucas,中国剩余定理,欧拉定理)
题目地址根据欧拉定理 ,设q上面的系数为x,模数为mod,由欧拉定理,原式等于 qx模mod−1q^{x 模 mod-1}qx模mod−1 % mod令 mod = mod - 1处理系数,暴力求解 -> 超时。分解 mod -> 2 3 4679 35617这样可以用lucas 来优化求解C(a,b).之后可以枚举n的所有约数,求出值x后对 这4个分别mod即 x mod 2 = a1x mod 3 = a2x mod 4679 = a3x mod 35617 =原创 2020-09-04 21:21:18 · 104 阅读 · 1 评论 -
Counting swaps acwing 212 (多重集的排列数)
题目地址由题目,我们可以连接出 k 个环。单调递增排序只需拆分每个环,让每一个元素都变成自环。引理:把一个长度为n的环变成n个长度为1自环,最少需要操作n-1次。设FnF_nFn 表示长度为n的自环变成n个长度为1的自环 的操作数有通项公式FnF_nFn = nn−2n^{n-2}nn−2 可以查阅资料,化简我不会,找出前几项,贴OEIS可以得到。那么整个序列的操作数为∏l=1kFl\prod_{l=1}^kF_l∏l=1kFl 再乘 (n−k)!∏l=1k(l−1)!\frac{(n原创 2020-09-04 16:34:36 · 138 阅读 · 0 评论 -
acwing 211 计算系数(二项式定理)
题目地址直接用二项式定理Ckn⋅an⋅xn⋅bm⋅ymC_k^n \cdot a^n \cdot x^n \cdot b^m \cdot y^mCkn⋅an⋅xn⋅bm⋅ym则求Ckn⋅an⋅bmC_k^n \cdot a^n \cdot b^mCkn⋅an⋅bm因为 k < 10007 所以都会有逆元,#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#inc原创 2020-09-04 11:17:05 · 141 阅读 · 0 评论 -
acwing 884 高斯消元解异或方程
题目地址和高斯消元解线性方程基本一致。最后return 0前面的操作中&是判断这个未知数是否对这个方程有影响#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<原创 2020-09-02 22:45:53 · 112 阅读 · 0 评论 -
acwing 883 高斯消元解线性方程组
题目地址模拟初等行变换就可以了。有很多种模拟,对于此题方便,有了这个模拟。从第一列开始,枚举未处理的行找到最大的主元素。交换最大主元素的行和当前行。如果最大主元素也为0,则不处理。把主元素的系数化为1.把其他未处理行的主元素列的系数都消去。继续处理,知道最后一列。之后特判r是否把所有列处理完,没有在判断是否无解还是多解。有则把每个x算出来。代码上有许多步骤解释#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);原创 2020-09-02 21:37:37 · 103 阅读 · 0 评论 -
acwing 204 poj 2891
题目地址中国剩余定理。m序列不一定两两互质的时候。考虑前两个方程,可以得到 x = k1k_1k1 * a1a_1a1 + m1m_1m1x = k2k_2k2 * a2a_2a2 + m2m_2m2则k1k_1k1 * a1a_1a1 - k2k_2k2 * a2a_2a2 = m2m_2m2 - m1m_1m1 … 1可以知道上面就是扩展欧几里得的方程。有解条件: gcd(a1a_1a1,a2a_2a2) | m2m_2m2 - m1m_1m1对于1方程我原创 2020-09-02 19:54:39 · 94 阅读 · 1 评论 -
acwing208 开关问题 异或高斯消元
题目地址设ai,ja_{i,j}ai,j 表示按j后i是否会发生变化(1是0否),xix_ixi 表示第i个开关是否按(1按0不按)则可以得到 一个开关变化的过程最终结果为 sa ^ en 开始的状态异或 结束的状态。即你不管怎么按,这个开关经过层层抵消,最终要按1或者不按0.而这个过程为 a1,1x1a_{1,1}x_1a1,1x1 xor a1,2x2a_{1,2}x_2a1,2x2 xor … xor a1,nxna_{1,n}x_na1,nxn… . . . . . . .原创 2020-08-31 17:17:50 · 129 阅读 · 0 评论 -
acwing 207 球形空间产生器 高斯消元
题目地址题目指出有解。设球心为(x1,x2,…,xn) ,则我们可以得到∑j=0n(ai,j−xj)2\sum_{j=0}^n (a_{i,j} - x_j)^2∑j=0n(ai,j−xj)2 = C。将其化简,让第一行减去第二行,依次类推。可以得到∑j=0n(ai,j−ai+1,j)=∑j=0n(ai,j2−ai+1,j2)\sum_{j=0}^n (a_{i,j} -a_{i+1,j}) =\sum_{j=0}^n(a_{i,j}^2 - a_{i+1,j}^2)∑j=0n(ai,j原创 2020-08-30 22:56:11 · 94 阅读 · 0 评论 -
acwing 206 石头游戏 矩阵快速幂
题目地址构建1维数组f(num(i,j)) -> 表示第num(i,j) =((i-1)*m + j)位的石头有多少个。(i,j)表示一个位置可以知道f的长度为n*m+1.令f[0] = 1.方便后面加x个石头的操作。构造:1: 第(i,j)位置字符为’N’,且i>1,则令A[num(i,j)][num[i-1,j]] = 1.这样在矩阵相乘的时候可以让让num(i,j)位置上的石头全部转移到num(i-1,j) 上面。(转义: 当计算f(num(i-1,j))列的时候,它会加上f (原创 2020-08-30 18:18:40 · 174 阅读 · 0 评论 -
扩展欧几里得
对于 ax + by = gcd(a,b) --> gcd(b,a%b) (由欧几里得算法知道)即ax + by = bx + (a-a/b * b)y -> x = y, y = x - a/b *y 。可以用gcd计算,回溯的时候套用这个公式即可。代码: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);原创 2020-08-29 23:32:44 · 68 阅读 · 0 评论 -
poj 1845 Sumdiv (约数的和,快速幂)
只求a的约数和是很好求的,求ab 也是一样的,只不过是多了些项(1+p+p2+p3+…+pb*c)*(…)…显然,每一项里面都是一个等比数列,且为(pb*c+1-1)/(p-1).当分子有逆元,即原式为(pb*c+1-1)*qmi(p-1,mod-2).否则,可以知道一个括号里面的项都会被取mod为1 即-> b*c+1代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<iostream原创 2020-08-21 00:55:47 · 132 阅读 · 0 评论 -
最幸运的数字(欧拉定理)
题目地址对于所有的88888… 可以用y = 8(10x-1)/9 来表示。由题,即求一个x,使得L|y ,设d=gcd(L,8).化简 -> 10x = 1(mod 9L/d)引用一个定理:若正整数a,n,互质,则满足ax = 1(mod n) 的最小正整数x是phi[n]的约数。phi为欧拉函数。题目数据较大,快速幂里面开两个__int128#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#includ原创 2020-08-20 17:17:02 · 321 阅读 · 0 评论 -
acwing Hankson的趣味题
题目地址对于lcm(b,x) = b1. 可以知道x是b1的一个约数。解法1: 故可以取求d的所有约数然后判断是否同时满足两个条件。解法2:假设b1通过唯一分解定理分解出来了所有质数。 对于每一个b1的质数p,假设a0,a1,b0,b1,x对应的个数为ma,ma1,mb,mb1,和 mx.考虑 gcd(a,x) = a1: -> gcd就是求两个数进行唯一分解后所有相同质因子中次数最小的乘积所以我们可以得到:1: 当ma > ma1 时,mx = ma12: 当ma = ma1原创 2020-08-18 18:46:11 · 151 阅读 · 0 评论 -
acwing 余数之和 (整除分块)
题目地址对题目化简 -> k mod i = k - ki\frac{k}{i}ik x i -> 即求 n x k - ∑i=1n∗i\sum_{i=1}^n * i∑i=1n∗i 而后面那个就是整除分块的基本模板,算的时候套一个等差数列求和公式。代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#原创 2020-08-17 22:32:08 · 128 阅读 · 0 评论 -
2020牛客多多校第七场 D(整除分块)
思路:1 : 从 第一个操作 知道所有 1,k 都是 传奇元组 ,再对(1,1)运用2操作,知道所有(x,1)都是传奇数组。故有 n+k-1个2: 对1,2 1,3 ,1,4 …进行操作2 一直循环操作下去 发现是 第一位数 是 xk+1,故若第一位 - 1 是第二位的倍数则 是传奇数组。3 同上,进行操作3,会发现, 第一位是 xk ,故若第一位是第二位的倍数,则是传奇数组。故即使求 对于所有的1~k,找到n是k的倍数 的个数和k是n-1倍数的个数。找倍数的,n/k 就可以知道有多少个。i原创 2020-08-10 16:53:39 · 88 阅读 · 0 评论 -
反素数
题目地址证明书上有 P141(算法进阶指南)。记录代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,int> pii;typedef long long ll原创 2020-08-17 21:50:23 · 170 阅读 · 0 评论 -
2020牛客多校第九场E
求gcd(x,y) 无非就是求x和y的所有质因子表示中,取相同质因子且次数最小的,例如 gcd(2,3) -> 21 31 -> 1(没有相同的) gcd(2,8) 21 23 -> 2 gcd(2,12) -> 21 22 X 31 -> 2先想暴力做法,先把x,y用唯一分解定律分解出来,之后对于每一个相同的质因子,两个循环,判断哪个的次数小就取哪个。这样无非就是超时。cx 为 x的一个质数的次数,cy同理所以,我们可以直接将两个循环拆开,对于i*cx,原创 2020-08-16 16:37:35 · 151 阅读 · 0 评论 -
阶乘分解
题目地址只需求出∑k=1mN/pk\sum_{k=1}^m N/p^k∑k=1mN/pk 且pk < N代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long long#define sc scanf#define pf printfusing namespace std;typedef pair<int,i原创 2020-08-15 14:37:55 · 198 阅读 · 0 评论 -
K倍区间
题目链接给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai+1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?输入格式第一行包含两个整数 N 和 K。以下 N 行每行包含一个整数 Ai。输出格式输出一个整数,代表 K 倍区间的数目。数据范围1≤N,K≤100000,1≤Ai...原创 2020-03-17 22:53:17 · 113 阅读 · 0 评论 -
可见的点 acwing201 欧拉函数(两个筛法求欧拉函数)
题目:在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。例如,点(4,2)就是不可见的,因为它与原点的连线会通过点(2,1)。部分可见点与原点的连线如下图所示:3090_1.png编写一个程序,计算给定整数N的情况下,满足0≤x,y≤N的可见点(x,y)的数量(可见点不包括原点)。输入格式第一行包含整数C,表...原创 2020-04-04 12:20:34 · 207 阅读 · 0 评论 -
2020hdu多校 1001 hud6827
选出每个区间,计算每个区间权重的平均值,的期望。si为i 的前缀和 ,inv为逆元,inv_sum为逆元前缀和。故对于每一个区间。会有:草图,当n等于4的时候跑一边循环就可以算出权值和,再和个数的逆元相乘就可以得到答案代码:#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#include<bits/stdc++.h>#define int long longusing namespace std;t原创 2020-08-06 18:06:37 · 131 阅读 · 0 评论 -
poj 2689(筛质数)
题目地址可以通过 R-L来寻找突破口, 对于任何一个合数都有不超过sqrt(n)的因子,所以我们可以筛出2~sqrt®的质数再通过这些质数将L-R中的所有非质数标记。最后直接枚举。对于筛选出来的每一个质数p,它对应L-R区间的倍数为j*p(ceil(L/p) <= j <= R/p)详细见代码#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//#include<bits/stdc++.h>#in原创 2020-08-15 12:25:49 · 498 阅读 · 0 评论