数论
qq_45778406
这个作者很懒,什么都没留下…
展开
-
Lucky7 HDU - 5768(中国剩余定理 + 容斥定理 + 二进制枚举)
Link题意:给你一个n, x, y, 然后后面n行每行一个质数 p[i], 和一个余数 m[i]让你求满足在 x~y之间满足能被7整除且不能满足任何一个 方程组 num % p[i] == m[i], p[i]是质数。思路:由题意想到要用中国剩余定理, 但题目要求的是 x%p[i] != m[i], 所以利用容斥定理S−A1∪A2∪A3...S−A_1∪A_2∪A_3...S−A1∪A2∪A3...S即为x~y中能被7整除的数A1∪A2∪A3...A_1∪A_2∪A_3...A1∪A2原创 2021-05-06 11:53:32 · 117 阅读 · 0 评论 -
GCD HDU - 1695
LINK题意:求1~n, 和 1 ~ m 中互质的本质不同的数对的数量。设n < m, 则可以转变成求 1 ~ n 与 1 ~ n 的数对 和 1 ~ n 与 n + 1 ~ m 的 数对, 前者直接时欧拉函数的前缀和即可(phi[i] :小于 i 且与 i 互质的数的数量。所以主要要考虑后者,很容易想到1 ~ n 和 j 互质的数 = n - (1 ~ n 与 j 不互质的数), 那怎么求不互质的数呢,可以将j分解为质因数, 显然质因数的倍数和j不互质,比如 2x, 3x, 所以我们原创 2021-04-20 16:55:08 · 109 阅读 · 0 评论 -
大数模板,刘汝佳支持负数
已重载的运算符,转载支持负数运算符类型 运算符双目运算符 +(加), -(减), *(乘), /(整除), %(取模)关系运算符 ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)逻辑运算符 ||(逻辑或), &&(逻辑与), !(逻辑非)单目运算符 +(正), -(负)自增自减运算符 ++(自增), –(自减)赋值运算符 =, +=, -=, *=, /=, %转载 2021-03-18 20:07:46 · 126 阅读 · 0 评论 -
利用差分求非齐次多项式的通项公式
as原创 2021-03-12 17:12:07 · 545 阅读 · 0 评论 -
求n!中因子k的个数
n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积下面推导这个公式n!=n∗(n−1)∗(n−2)∗......3∗2∗1n!=n*(n-1)*(n-2)*......3*2*1n!=n∗(n−1)∗(n−2)∗......3∗2∗1=(k∗2k∗3k.....∗mk)∗a=(k*2k*3k.....*mk)*a=(k∗2k∗3k.....∗mk)∗a a是不含因子k的数的乘积,显然m=n/k;m=n/k;m=n/k;=(km)∗(1∗2∗3...∗m)原创 2021-03-09 16:33:04 · 164 阅读 · 0 评论 -
大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
转载来自#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<iostream>#include<algorithm>using namespace std;#define ll long long//*********************************************************转载 2021-03-09 11:23:39 · 246 阅读 · 0 评论 -
最小覆盖圆模板(二维)
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int N=5005;int n;double r;struct dian{ double x,y; dian(double X=0,double Y=0) { x=X,y=Y; } dian operator + (const dian &a原创 2021-03-07 20:31:14 · 130 阅读 · 0 评论 -
一段连续值异或
结论如果数字数字, 那么偶奇偶奇异或起来为0,eg 4 ^ 5 ^ 6 ^ 7 = 0快速求1 ~ n 的异或值 O(1)ll f(ll a){ if(a%4==1) return 1; else if(a%4==2) return a+1; else if(a%4==3||a==0) return 0; else return a;}...原创 2021-03-05 10:04:55 · 271 阅读 · 1 评论 -
Query on A Tree(可持续01线段树+dfs序)
Link题意给你一棵树,每个节点有权值,Q次询问,求u为跟的子树一个点与x亦或后的值最大是多少。思路对于异或我们很容易联想到异或, 但显然对于每个点都需要开一个01字典树, 但如果每个点都开一个01字典树来表示其子树,显然空间不够, 所以引出了可持续化01字典树,和主席树类似。所以我们先按照前序遍历建立可持续化01字典树然后对于每个查询 u, xl = st[u], r = st[u];我们用 root[l - 1]这个01字典树和root[r], 来对比出以u为根的字典树,然后直接查询最大原创 2021-03-04 00:00:00 · 580 阅读 · 1 评论 -
矩阵快速幂模板
#include <bits/stdc++.h>using namespace std;#define ll long longconst ll mod = 1e9 + 7;const int N = 4; // 阶数struct Matrix{ ll m[N][N]; Matrix(){memset(m, 0, sizeof m);} Matrix operator * (const Matrix &y) const { Matrix z; for(int原创 2021-03-02 20:54:53 · 55 阅读 · 0 评论 -
Covering(高斯消元递推+矩阵快速幂)
Link题意:让你用12规格的地毯去铺4n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠。答案对1000000007取模。思路:经过几次推导发现f(n)f(n)f(n) 必然与f(n−1),f(n−2)f(n-1), f(n-2)f(n−1),f(n−2)等等有关,我们只需要求出其系数就好了,设f(n)=x∗f(n−1)+y∗f(n−2)+z∗f(n−3)+...f(n) = x*f(n-1) + y*f(n-2) + z*f(n-3) + ...f(n)=x∗f(n−1)原创 2021-03-02 20:52:12 · 132 阅读 · 0 评论 -
高斯消元解线性方程组
#include <bits/stdc++.h>using namespace std;const int N = 110;const double eps = 1e-7;double a[N][N];int n;int gauss(){ int c, r; for (c = 0, r = 0; c < n; c ++ ) { // 选择绝对值最大的做主元 int t = r; for (int i原创 2021-03-02 16:42:10 · 92 阅读 · 0 评论 -
某个数的约数个数和约数和
如果 N=p1c1∗p2c2∗...∗pkckN = p1^{c1} * p2^{c2} * ... *pk^{ck}N=p1c1∗p2c2∗...∗pkck约数个数: (c1+1)∗(c2+1)∗...∗(ck+1)(c1 + 1) * (c2 + 1) * ... * (ck + 1)(c1+1)∗(c2+1)∗...∗(ck+1)约数之和: (p10+p11+...+p1c1)∗...∗(pk0+pk1+...+pkck)(p1^0 + p1^1 + ... + p1^{c1}) * ... *原创 2021-03-02 15:19:52 · 89 阅读 · 0 评论 -
1~n约数和
求1 ~ n 的约数和n\sqrt{n}n的方法整除分块#include <bits/stdc++.h>using namespace std;#define ll long longconst ll N = 1e7 + 10;ll f[N];ll get_Y(ll x) // 求1 ~ n的约数和不包括(1, 和本身){ ll m = sqrt(x); ll sum = 0; for(int i = 2; i <= m; i++) { ll tmp =原创 2021-03-01 22:06:46 · 232 阅读 · 0 评论 -
扩展中国剩余定理
中国剩余定理有个更复杂的版本就是处理模数不互质的情况,此时由于Mi与mi不再互质导致ti可能不存在,考虑将方程组合并.假设现在只有两个方程组即n = 2因为x要满足第一个方程所以x可以表示成x=a1+p∗m1x = a_{1} + p*m_{1}x=a1+p∗m1,现在要使得x满足第二个方程,也就是找到一个t使得a1+t∗m1≡a2(mod m2)a_{1}+t*m_{1}\equiv a_{2}(mod\,m_{2})a1+t∗m1≡a2(modm2)化简得到t∗m1≡(a2−a1)原创 2021-02-22 12:02:57 · 127 阅读 · 0 评论 -
exgcd
一、前言本博客适合已经学会欧几里得算法的人食用~~~二、扩展欧几里得算法为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)。通俗的说就是:如果ax+by=cax+by=cax+by=c有解,那么c%gcd(a,b)=0c\%gcd(a,b)=0c%gcd(a,b)=0扩展欧几里得算法就是来求解ax+by=cax+by=cax+by=c这个方程的(转载 2021-02-18 00:26:51 · 135 阅读 · 0 评论 -
Looooops(线性同余方程, exgcd)
题目描述一个C语言的for循环: for(int i=A;i!=B;i+=C)st;其中i表示变量,A、B和C分别表示初值、终值和步长,st表示循环体。要求计算当循环变量i运算在k位无符号整数体系下(运算值范围:0~2^k-1,此时,i+=c溢出后截断),循环体st会执行多少次?输入格式输入每组数据包括4个整数A,B,C和k。输出格式对于每组数据,输出循环次数,如果永远不能结束,输出FOREVER。输入样例1 3 2 41 5 2 41 2 4 30 0 0 0输出样原创 2021-02-17 22:49:08 · 190 阅读 · 0 评论 -
Fansblog(Miller_Rabin, 费马小定理, 逆元, 威尔逊定理)
题面给你一个素数p,让你求 k!%p, 其中k为比p小的整数里最大的素数。例如p=5,则k=3。p=11,则k=7。 k! = k*(k-1)*······21;Input第一行包含一个整数 T(1<=T<=10) 表示测试样例的个数.接下来有T行,每行包含一个素数 p (1e9≤p≤1e14)Output对于每个测试样例,输出一个整数k!%p,代表答案Sample Input11000000007Sample Output328400734思路: 威尔逊定理 (p -原创 2021-02-17 17:40:02 · 171 阅读 · 0 评论 -
威尔逊定理
原创 2021-02-15 00:14:13 · 121 阅读 · 0 评论 -
牛牛与整除分块
题目描述整除分块,又称数论分块。是数论算法中的重要技巧,你可以在各种需要枚举因子的连续求和类问题中见到它的身影。如杜教筛,莫比乌斯反演化简后的整除分段求和等。整除分块基于这样一个数学现象:对于任意正整数N,集合S={x:x=⌊Ni⌋,i∈1,2,3…N}S=\left { x:x=\left \lfloor \frac{N}{i} \right \rfloor ,i\in 1,2,3…N \right }S={x:x=⌊iN⌋,i∈1,2,3…N}的大小总是严格小于2N2 \sqrt N2N。例原创 2021-02-04 23:29:41 · 218 阅读 · 0 评论 -
牛牛的“质因数”(筛法,dfs)
题目描述算数基本定理,又称唯一分解定理,算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。即N=p1e1⋅p2e2…pmem(p1<p2<…pm)N=p_1^{e_1}\cdot p_2{e_2}…p_m{e_m}(p_1 < p_2< … p_m)N=p1e1⋅p2e2…pmem(p1<p2<…pm)朴素的质因子分解算法就是利用了算数基本定理,依次枚举p判断N是否包含素因子p。牛牛最近对于质因原创 2021-02-04 17:39:14 · 279 阅读 · 0 评论 -
线性筛法求素数的原理与实现
何为线性筛法,顾名思义,就是在线性时间内(也就是O(n))用筛选的方法把素数找出来的一种算法,没用过线性筛素数法的人可能会奇怪,用遍历取余判定素数不是也是线性时间的吗,没错,但是确切的说线性筛法并不是判定素数的,而是在线性时间内求出一个素数表,需要判定是否是素数的时候只要看该数是否在表内就可以瞬间知道是不是素数。比如想求10000以内的素数,定义表int a[10000],进行线性筛选后,a[n]的值就代表n是不是素数,a[n]如果是1,就代表n是素数,a[n]如果是0,就代表n不是素数,这就是查表。再判转载 2021-02-04 14:26:26 · 1213 阅读 · 0 评论 -
Longge‘s problem(欧拉函数)
题面数论只会GCD,现在SonG给你一个n很大,他现在想知道1到n的所有数字与n的最大公约数之和。Input多组输入每一组一行一个n (1<n<2^31)Output输出一行一个数,表示你的答案Sample Input26Sample Output315思路:题面简单,题目要求求出所有gcd(i, n) i 从1到n, 的和, 显然我们可以发现 gcd(n, n) = n, 和欧拉函数可得 φ(n) 个gcd(i, n) 为一, 所以在gcd(i, n) 中原创 2021-02-04 00:47:03 · 266 阅读 · 1 评论 -
费马小定理&欧拉降幂
a * a ^ (p - 2) = 1 (mod)p => a ^(p - 2) = a^(-1) mod所以在乘法取模运算中可以用 a^(p - 2)代替 a ^ (-1), 也相当于用作小数取模原创 2021-02-03 10:49:52 · 256 阅读 · 0 评论 -
点一成零(并查集,逆元)
题目描述牛牛拿到了一个n*n的方阵,每个格子上面有一个数字:0或1行和列的编号都是从0到n-1现在牛牛每次操作可以点击一个写着1的格子,将这个格子所在的1连通块全部变成0。牛牛想知道,自己有多少种不同的方案,可以把全部格子的1都变成0?所谓连通块,是指方阵中的两个正方形共用一条边,即(x,y)和以下4个坐标的数是连通的:(x-1,y)、(x+1,y)、(x,y-1)、(x,y+1)这个问题对于牛牛来说可能太简单了。于是他将这个问题变得更加复杂:他会选择一个格子,将这个格子上的数字修改成1(如果原创 2021-02-02 22:06:18 · 309 阅读 · 1 评论 -
串
题目描述长度不超过nnn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对109+710^9+7109+7取模。所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。例如,“unoacscc"包含子序列"us”,但"scscucu"则不包含子序列"us"输入描述:一个正整数nnn(2≤n≤1062 \leq n \leq 10^62≤n≤106)输出描述:一个正整数,为满足条件的字符串数量对109+710^9+7109+7取模的值示例1输入2输出1原创 2021-02-02 12:34:43 · 262 阅读 · 0 评论 -
String painter(区间dp难)
题目描述有两个长度相等,都只由小写字母构成的字符串A和B. 现在你有一把充满魔♂力的刷子。使用这把刷子,你可以把字符串中连续的一段区间刷♂成一个相同的字符,例如,对于字符串"vandarkholme",把区间[3,6]刷成’d’,可以变成"vanddddholme"。现在你要用这把刷♂子把字符串A变成B,最少要刷多少次?输入多组数据,每组数据都有两行:第一行是字符串A.第二行是字符串B.字符串长度不超过100.输出在单独的一行中输出结果样例输入zzzzzfzzzzzabcdefed原创 2021-01-22 20:52:00 · 372 阅读 · 0 评论 -
min25筛
用于求积性函数 [公式] 的前 [公式] 项和,要求 [公式] 在素数处为一多项式,在素数的整数幂处可以直接求值。作者:Artiprocher链接:https://www.zhihu.com/question/379824357/answer/1088257294来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。#define rep(i,a,b) for(ll i=a;i<=b;i++)typedef long long ll;class Multipli原创 2021-01-22 11:47:50 · 65 阅读 · 0 评论 -
欧拉函数
vector<ll> factors(ll x){ vector<ll> fac; ll y=x; for(ll i=2;i*i<=x;i++){ if(y%i==0){ fac.push_back(i); while(y%i==0)y/=i; if(y==1)return fac; } } if(y!=1)fac.push_back(原创 2021-01-22 11:42:47 · 62 阅读 · 0 评论 -
组合数取余[C(n,m) %p]
如果 n, m很小(不超过50),可以用C++的库函数 double tgamma(double x) ,这是一个欧拉积分.ll C(ll n,ll m){ return (ll)round(tgamma(n+1)/tgamma(m+1)/tgamma(n-m+1));}如果 n, m比较大,可以开 O(n)的空间,可以利用逆元来求解,当然,要保证 p 是素数const ll mo=1e9+7;ll C(ll n,ll m){ static ll M=0,inv[N],mul[原创 2021-01-22 11:28:52 · 375 阅读 · 0 评论 -
判断质数
下面的模板是 kn + i,, k == 30的版本bool isPrime(ll n){ if(n==2||n==3||n==5)return 1; if(n%2==0||n%3==0||n%5==0||n==1)return 0; ll c=7,a[8]={4,2,4,2,4,6,2,6}; while(c*c<=n)for(auto i:a){if(n%c==0)return 0;c+=i;} return 1;}...原创 2021-01-22 11:19:01 · 166 阅读 · 0 评论 -
线性筛
void getPrime(bool p[],int n){ for(int i=1;i<=n;i++)p[i]=true; p[1]=false; for(int i=2;i<=n;i++){ if(p[i]){ for(int j=i+i;j<=n;j+=i)p[j]=false; } }}原创 2021-01-22 11:13:38 · 67 阅读 · 0 评论 -
欧拉降幂
为了求解这个式子a^bmodc,我们可以怎么做?暴力pow?快速幂?很显然,当b大到一定程度时,利用pow或者快速幂这样的算法是无法在给定时间内求解的,这时我们引入欧拉降幂算法,这个算法的特点就是降低幂方的值而不影响最终结果,使我们解决问题的时间缩短。结论:先给出欧拉降幂的公式:欧拉函数ll euler_phi(ll n){ ll k = (ll)sqrt(n + 0.5); ll ans = n; for(int i = 2; i <= k; i++)原创 2021-01-22 11:00:47 · 103 阅读 · 0 评论 -
筱玛爱地理(分数取模,快速幂取模)
链接:https://ac.nowcoder.com/acm/contest/946/A筱玛爱地理题目描述筱玛是一个热爱地理的好筱玛。最近,在《地理II》作业本上,筱玛学到了“贝塔指数”的概念:在经济地理学中,交通的联结度表示交通网络的发达程度,通常用贝塔指数来计算与比较。若用VVV表示一个交通网络中结点的数量,用EEE表示边的数量,则贝塔指数的计算方式为:β=EV\beta=\frac{E}{V}β=VE。“实践是检验真理的唯一标准”。作为一个热爱地理的好筱玛,她马上就把新学的知识应用到实践当原创 2020-10-04 20:00:02 · 252 阅读 · 1 评论