
ACM笔记-5代数
cj1064789374
大佬们多多指教
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
和式的下标转换与莫比乌斯函数
和式的下标转换==式子里面有个数论符号 x|d 表示d是x的倍数,专业术语叫x整除d ,比如x=2,n=7就是f(2)+f(4)+f(6)变化一下,枚举x的倍数i,因为d=x*i的.变成右边式子 再来一个多重和式,这里对于i*j而言,i,j枚举范围互不影响,两个变量独立,所以化简为: 莫比乌斯反演莫比乌斯函数的定义p1,p2,p3,...,pk为互不相等素数...原创 2019-01-03 13:41:09 · 487 阅读 · 0 评论 -
逆元
逆元对正整数a若有ax恒等于1(modm),则同余方程中的最小正整数解x叫做a模m的逆元应用:化除为乘消除精度误差由ax≡1(mod m)推导得x=1/a(mod m),所以(b/a)mod m=(b*x)mod m=(b%m*x%m)%m例题hdu1576求(A/B)%9973,A能被B整除且gcd(B,9973)=1题解ans=(A/B)%9973=(A*b)%9973=(A%99...原创 2019-01-03 13:41:52 · 434 阅读 · 0 评论 -
欧拉函数
欧拉函数定义:对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 欧拉公式的延伸:一个...原创 2019-01-03 13:41:56 · 724 阅读 · 0 评论 -
求1到n的k次方和
求1到n的k次方和原创 2019-01-04 00:31:47 · 4811 阅读 · 0 评论 -
排列组合CNK模P
#include <bits/stdc++.h>using namespace std;int fact[100];int extgcd(int a, int b,int &x, int &y){//扩展欧几里德求逆元 int d = a; if(b != 0){ d = extgcd(b, a % b, y, x); ...原创 2019-01-04 00:31:51 · 1903 阅读 · 0 评论 -
离散化+树状数组
#include<bits/stdc++.h>using namespace std;struct node{int val,pos;}a[10];int n,b[10],sum[103];bool cmp(node a,node b){ return a.val<b.val;}void update(int pos,int v){ while(po...原创 2019-01-05 10:05:44 · 311 阅读 · 0 评论 -
可持久化数组
可持久化数组P3919 【模板】你需要维护这样的一个长度为 N 的数组,支持如下几种操作在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)1.对于操作1,格式为 vi 1 loci valuei,即为在版本 v...原创 2019-01-05 10:05:35 · 389 阅读 · 0 评论 -
二维线段树
#include <bits/stdc++.h>using namespace std;const int maxn=1010;int n,m,ans,tree[maxn<<2][maxn<<2];void update_y(int q1,int q2,int yl,int yr,int xt,int yt){//传入Y维要更新区间Q1,Q2,搜索区间...原创 2019-01-06 11:21:21 · 221 阅读 · 0 评论 -
分块
原创 2019-01-05 10:05:22 · 143 阅读 · 0 评论 -
斐波那契数列取模(循环节)
hdu 1021 斐波那契数列取模(循环节)题意:F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2)每次输入N,问第F(N)是否被3整除,是则YES,否则NO#include <bits/stdc++.h>using namespace std;int a[50];int main(){ int n; ...原创 2019-01-05 10:05:14 · 2644 阅读 · 0 评论 -
杜教筛
杜教筛 于是μ的前缀和就可以求了, 其他就是乘了一些奇怪的数也差不多是这样化不用哈希,因为我们预处理了至少√n个,所以我们要算的所有的数都是小于√n的,当我们在计算n的答案时,在计算过程中所要访问的所有数x,它的n/x的值都是唯一的,所以我们就直接用n/x作为它的哈希值, 计算下一个答案时再清空即可 【51nod 1244】莫比...原创 2019-01-05 10:05:10 · 148 阅读 · 0 评论 -
返下标的ST表
返下标的ST表#include<bits/stdc++.h>using namespace std;const int maxn=10003;int rmq[maxn],mm[maxn],st[22][maxn];void init_rmq(int n){ mm[0]=-1; for(int i=1;i<=n;i++)mm[i]=((i&i-1...原创 2019-01-05 10:05:04 · 217 阅读 · 0 评论 -
二维线段树
#include <bits/stdc++.h>using namespace std;int n,m;char c;int d[1005][1005];//一句话解释树状数组:下标化成二进制//对某个下标I,其它所有加上自己最低位的1后等于I的下标,存的值累加到存的值,还有I位的值//例如5,二制制0101,则每次加最低位得到的下标,0110,1000,都包含它,所以添加...原创 2019-01-05 10:04:58 · 169 阅读 · 0 评论 -
二维RMQ
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;const int N = 300 + 2;int dp[N][N][9][9];void RMQ_inin(int m, int n){//维护M行N列的...原创 2019-01-06 11:21:27 · 257 阅读 · 0 评论 -
动态ST表
动态ST表#include<bits/stdc++.h>using namespace std;int a[20003],f[20003][21],t,d,n,m;void change(int u){ f[u][0]=a[u];//首先第U格往左走2^0步的最大值就是其自身 for(int i=1;u-(1<<i)>=0;i++)//然后往...原创 2019-01-05 10:06:14 · 579 阅读 · 0 评论 -
单调栈
#include <iostream>#include <cstdio>#include <cstring>#define MAX_N 100005using namespace std;int main(){ int n; while(~scanf("%d",&n)&&n) { i...原创 2019-01-06 11:21:39 · 111 阅读 · 0 评论 -
大质数判断Miller_rabin与分解Pollard rho
大质数判断Miller_rabin与分解Pollard rho模板#include <bits/stdc++.h>#define ll long longusing namespace std;map<ll,int> ans;//开一个MAP存答案,LL是要输出的质数,INT是其个数ll mult(ll a, ll b, ll p){//快速乘法取模,求A*B模...原创 2019-01-06 11:21:44 · 223 阅读 · 0 评论 -
大区间筛素数
大区间筛素数 简述:有的时候,我们需要知道某个特定区间的素数(区间大小较小,但数可能很大)。 那么数组就开不下,这时候我们仍然可以使用筛法,只是所有的下标都进行了偏移。 大家理解下面这段代码可以先用普通筛法写,然后数组下标集体移动即可。#include<bits/stdc++.h>const int maxn = 1000001;int PrimeLis...原创 2019-01-08 00:03:05 · 512 阅读 · 0 评论 -
块状数组
#include <bits/stdc++.h>using namespace std;int const maxn = 1000010;int const smaxn = 2005;//smaxn = sqrt(maxn)char ch[maxn];int sum[maxn];intn,m,num;//大块的个数struct ListBlock{//块状数组的每一个...原创 2019-01-04 00:31:44 · 204 阅读 · 0 评论 -
素数判断(六倍&随机)
六倍法:规律:大于等于5的质数一定和6倍数相邻。证明:令x≥1,将大于等于5的自然数表示:•••••• 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ••••••可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要...原创 2019-01-04 00:31:38 · 1121 阅读 · 0 评论 -
约数定理+线性筛素数
约数定理已知,令d(x)表示x的因子(或者叫约数)个数则.线性筛法打d(x)表:每个数都是被它最小的素因子筛掉的,那么用g[i]表示i的最小素因子的幂次,注意d(x)的表达式,它是部分积性函数d(p1^a1*p2^a2)=d(p1^a1)*d(p2^a2)void init(){ memset(vis,false,sizeof vis); d[1]=1, g[1]...原创 2019-01-03 13:41:14 · 186 阅读 · 0 评论 -
线段树区间更新
#include <bits/stdc++.h>using namespace std;int n,tre[10003*4],int laz[10003*4];void pushdown(int num){ if(laz[num]!=0){ tre[num*2]+=laz[num]; tre[num*2+1]+=laz[num]; ...原创 2018-12-31 00:33:12 · 327 阅读 · 0 评论 -
线性筛素数
#include <cstdio>using namespace std;typedef long long LL;const int MAX = 50000000;bool vis[MAX];int prim[3100005];int main(){ int d = sqrt(1.0*MAX);//至根号 int s = 0; for(int i...原创 2019-01-03 13:41:18 · 127 阅读 · 0 评论 -
寻找第N质数-分块筛
寻找第N质数-分块筛pos数组是以50000为间隔的前面几个块素数个数,是用之前的代码本地跑出来的,就是说1-5W有多少个素数,1-10w有多少个素数这样子。然后每次输入n找到他在哪个区间内,再单独筛出这个区间内的素数就好了#include<stdio.h>#include<queue>#include<string.h>#define MIN(a...原创 2019-01-03 13:41:22 · 569 阅读 · 0 评论 -
中国剩余定理
中国剩余定理给出了下图所示的一元线性同余方程组有解的判定条件,并用构造法给出了在有解情况下解的具体形式:一元线性同余方程组说明:假设整数m1,m2, … ,mn两两互质,则对任意的整数:a1,a2, … ,an,方程组 有解,并且通解可以用如下方式构造得到: 设 M = m1*m2*…*mn 是整数m1,m2, … ,mn的乘积,并设 Mi = M/mi 是除了mi以外的n...原创 2019-01-03 13:41:28 · 221 阅读 · 0 评论 -
线段树区间合并+扫描线
线段树区间合并+扫描线题目:求N个矩形面积并#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+5;int t[N*2]; //标记数量int vis[N+2]; //标记数组void update(int root,int kl,int kr,int nu...原创 2018-12-31 00:33:21 · 212 阅读 · 0 评论 -
最小的有N个因子的数
#include <bits/stdc++.h>using namespace std;#define ULL unsigned long longint n,p[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};ULL ans;void dfs(int depth,ULL tmp,int num){//当前深度,当前值,当...原创 2019-01-04 00:31:06 · 969 阅读 · 0 评论 -
自然数的幂和
Input13 3output36#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL MOD = 1000000007;const int N = 2005;LL C[N][N],B[N],Inv[N],Tmp[N],n;void Init(){ //预处...原创 2019-01-04 00:31:10 · 487 阅读 · 0 评论 -
中国剩余定理证明
#include<bits/stdc++.h>#define N 1010using namespace std;long long m[N], r[N];int n;long long x, y;long long gcd(long long a, long long b){ if (!b) return a; return gcd(b, a%b);}...原创 2019-01-03 13:41:32 · 562 阅读 · 0 评论 -
数列差分与前缀和
前缀和的概念相信很多人都知道.就是一个数组,要快速静态查询区间和,我们只要处理一个数组时A[i]=a[1]+a[2]+...+a[i].那么查询区间[l,r]的时候只要输出A[r]-A[l-1].那么这是时候预处理是O(n)的,查询一次是O(1).在很多情况下这种算法都是可行的,但是必须满足区间减法的性质.代码预处理如下:for (int i=1;i<=n;i++)...原创 2019-01-03 13:41:36 · 352 阅读 · 0 评论 -
任意区间GCD数
#include<bits/stdc++.h>#define pi acos(-1.0)using namespace std;typedef long long ll;const int maxn=5e5+30;vector<ll>dp,pd;unordered_map<ll,int>mp;//作用同MAP,但是底层是用HASHint main...原创 2019-01-03 13:41:40 · 526 阅读 · 0 评论 -
素因子总个数打表
素因子总个数打表#include <bits/stdc++.h>#define PI acos(-1)#define eps 1e-8#define inf 0x3f3f3f3f#define debug(x) cout<<"---"<<x<<"---"<<endltypedef long long ll;usin原创 2019-01-04 00:31:16 · 264 阅读 · 0 评论 -
线段树单点更新
#include <bits/stdc++.h>#define N 10010using namespace std;int tre[N*4];void build(int num,int le,int ri){ if(le==ri){ scanf("%d",&tre[num]); return ; } int ...原创 2018-12-31 00:33:05 · 244 阅读 · 0 评论 -
求n以内的因子最多的数
51nod 1060 求n以内的因子最多的数(不止一个则取最小)把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。 例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂度相等,输出最小的#include <bits/stdc++.h>using namespace std;typedef long...原创 2019-01-04 00:31:20 · 1274 阅读 · 0 评论 -
容斥原理
#include <bits/stdc++.h>using namespace std;int gcd(int a,int b){ while(b) { int t=a; a=b; b=t%b; } return a;}int main(){ int n,m; while(~scan...原创 2019-01-04 00:31:24 · 140 阅读 · 0 评论 -
区间阶梯和及单点更新
# include <bits/stdc++.h># define lson l, mid, id<<1# define rson mid+1, r, id<<1|1using namespace std;typedef long long LL;const int maxn = 1e5+30;LL a[maxn], s[maxn], b[maxn...原创 2019-01-05 10:05:50 · 274 阅读 · 0 评论 -
树状数组区间更新
树状数组(1)、单点增减+区间求和思路:C[x]表示该点的元素:sum(x)=C[1]+C[2]+……C[x]int arr[MAXN];inline int sum(int x){int res=0;while(x)res+=arr[x],x-=lowbit(x);return res;}inline void add(int x,int n){while(x<MAXN...原创 2019-01-04 00:31:32 · 255 阅读 · 0 评论 -
尺取法&极值&全排列
尺取法用途:某条件下求最短连续子序列题目:POJ3061题意:给N个数的数列,求总和少于K的最短连续子序列长度Input output5 11 31 2 3 4 5#include<bits/stdc++.h>using namespace std;int n,k,a[100003];void solve(){ cin>>n>...原创 2019-01-06 11:21:49 · 148 阅读 · 0 评论 -
ST表
ST表(sparse table)用途:RMQ(range minimum/maximum query)区间查询最值举例:给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1。方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1))。虽然还可以使用线段树、树状链表等求解区间最值,但是ST算法要比它们更快,而且适用于在线查询。(1)...原创 2019-01-06 11:22:04 · 136 阅读 · 0 评论 -
倍增RMG
#include<bits/stdc++.h>#define inf 0x3f3f3f3f#define eps 1e-8#define pi 3.1415typedef long long ll;using namespace std;int n,m,a[50005];int fMin[50001][20];int fMax[50005][20];void ini...原创 2019-01-06 11:22:08 · 166 阅读 · 0 评论