
数学/数论
文章平均质量分 89
。
proudzhao
这个作者很懒,什么都没留下…
展开
-
FFT例题
FFT,NTT,FFT优化,模版P3723 [AH2017/HNOI2017] 礼物ABC196 F. Substring 2CF528D Fuzzy SearchCF1709F Multiset of Strings原创 2022-10-03 16:53:54 · 459 阅读 · 0 评论 -
幂塔的计算 (欧拉降幂)
形如以下式子的东西叫做幂塔:aaaa...a^{a^{a^{a^{...}}}}aaaa...题目给定a,n,ma,n,ma,n,m,计算aaa的nnn层幂塔对mmm取模后的结果。(1<=a,n,m<=1e61<= a,n,m<=1e61<=a,n,m<=1e6)解法欧拉降幂公式运用欧拉降幂递归求解即可。具体过程:定义的递归函数形式:f(a,n,m)f(a, n, m)f(a,n,m),表示aaa的nnn层幂塔对mmm取模后的结果。首先是对原创 2021-12-24 20:55:32 · 2091 阅读 · 0 评论 -
莫比乌斯反演
莫比乌斯函数对于一个正整数nnn,μ(n)\mu(n)μ(n)为其莫比乌斯函数。莫比乌斯函数是怎么样定义的呢?首先,对于任意一个正整数nnn来说,由算数基本定理知,一定可以将其分解成n=p1a1p2a2...pkakn=p_1^{a_1}p_2^{a_2}...p_k^{a_k}n=p1a1p2a2...pkak的形式。定义μ(n)={(−1)k, a1=a2=...=ak=10, otherwise\mu(n)=\begin{cases} (-1)^k,\ a_1=原创 2021-09-29 21:14:27 · 1349 阅读 · 0 评论 -
学习笔记:整除分块
有这样一个式子:∑i=1n⌊ni⌋\sum_{i=1}^n\lfloor \frac{n}{i} \rfloor∑i=1n⌊in⌋,求出它的结果。我们当然可以从111到nnn一个一个算,但这样太慢了。先看一个例子,当n=20n=20n=20的时候:可以看到,有许多不同的iii值对应的其实是相同的结果。我们是不是可以找到一个区间[l,r][l,r][l,r],使得⌊nl⌋\lfloor \frac{n}{l} \rfloor⌊ln⌋一直到⌊nr⌋\lfloor \frac{n}{r} \rf原创 2021-09-29 14:03:05 · 233 阅读 · 0 评论 -
简单博弈论
文章目录巴什博弈尼姆博弈巴什博弈问题:只有一堆nnn个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取mmm个。最后取光者得胜。若只有000 ~ mmm个物品,先手必胜。若有m+1m+1m+1个物品,先手必败。因为先手最多取m个,不管先手取多少个,后手都可以一次取完若有(m+1)+r,(1<=r<=m)(m+1)+r,_{(1<=r<=m)}(m+1)+r,(1<=r<=m)个,先手必胜。这种情况下,先手可以拿rrr个,轮到后手拿的时候,就原创 2021-09-27 14:08:57 · 321 阅读 · 0 评论 -
学习笔记:组合数
不同情境下组合数的求法1、求组合数 I给定n组询问,每组询问给定两个整数a,b,请你输出C(a,b) mod (1e9+7)的值。输入格式第一行包含整数n。接下来n行,每行包含一组a和b。输出格式共n行,每行输出一个询问的解。数据范围1≤n≤10000, 1≤b≤a≤2000做法:有一万次询问,如果每次都算一遍,那么肯定会超时,再来看数据范围a和b都不大于2000,可以提前把所有的C(a,b)算出来,用数组存起来,这样每次询问的时候直接输出就好了const int N = 20.原创 2021-02-16 12:28:14 · 301 阅读 · 0 评论 -
高斯消元解线性方程组
高斯消元是一种求解线性方程组的方法,时间复杂度为O(n3)O(n^3)O(n3)。对于这样NNN个NNN元一次方程组:{a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2............an1x1+an2x2+...+annxn=bn\begin{cases}a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1\\a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2\\............\\原创 2021-09-26 11:39:22 · 954 阅读 · 0 评论 -
ACM中一些常用数学公式定理的简单推理及证明
文章目录更相减损术更相减损术gcd(a,b)=gcd(a,b−a)gcd(a,b)=gcd(a,b-a)gcd(a,b)=gcd(a,b−a)证明:证明:证明:若有gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,则有a=k1d, b=k2da=k_1d,\ b=k_2da=k1d, b=k2d,且k1k_1k1与k2k_2k2一定互质,即gcd(k1,k2)=1gcd(k_1,k_2)=1gcd(k1,k2)=1。设gcd(a,b−1)=xdgcd原创 2021-09-22 13:44:46 · 1027 阅读 · 0 评论 -
学习笔记:逆元
如果 ax≡1 (mod p),那么,x就是a的逆元,相互的,a也是x的逆元。那么你逆元有什么用呢?首先我们需要知道,取余运算对除法是不适用的,a/b % p ≠ (a%p / b%p) %p,如果我们要计算若干个数相乘起来除以某个数时,并不能像乘法那样边乘边取余,所以我们可以将a/b%p转化为 ab-1%p (b-1是指b在模p下的逆元,不是b的-1次方),这样就可以边乘边取余逆元的求法:方法一:欧拉函数int power(int a,int b,int p){ int res=1%p;原创 2021-02-12 14:07:56 · 489 阅读 · 0 评论 -
学习笔记:扩展欧几里得
写法一:int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } int g=exgcd(b,a%b,x,y); //参数正传 int x0=x,y0=y; x=y0; y=x0-a/b*y0; return g;}int main(){ int n; cin>>n; while(n--) { int a,b; a=read(); b=read();原创 2021-02-09 16:57:18 · 149 阅读 · 0 评论 -
学习笔记:筛质数
1、埃氏筛const int N = 1e6+5;bool vis[N];int prime[N],cnt; //数组存质数void get_prime(int x) //获取1~x内的质数{ for(int i=2;i<=x;i++) { if(!vis[i]) //如果该数没有被筛掉,说明它是质数 { prime[cnt++]=i;//加入质数表 for(int j=i+i;j<=x;j+=i) vis[j]=1;//将它的所有倍数筛掉 } }}原创 2021-02-08 18:10:15 · 225 阅读 · 0 评论 -
学习笔记:欧拉函数
欧拉函数定义:单个欧拉函数求法:int euler(int x){ int res=x; for(int i=2;i<=x/i;i++) { if(x%i==0) { res=res/i*(i-1); while(x%i==0) x/=i; } } if(x>1) res=res/x*(x-1); return res;}int main(){ int n; cin>>n; while(n--) { int x; cin&原创 2021-02-09 15:42:35 · 335 阅读 · 0 评论 -
满足条件的01序列
给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个。输出的答案对109+7取模。输入格式共一行,包含整数n。输出格式共一行,包含一个整数,表示答案。数据范围1≤n≤1e5做法:模型抽象:将0,1序列看成一个在坐标轴中走法,0代表向右走,1代表向上走,一开始在(0,0)点,因为0与1都有n个,最后一定是从(0,0)走到了(n,n)以6为例:在来看条件:要求任意时刻0的个数不少于1的个数,原创 2021-02-16 13:12:32 · 578 阅读 · 1 评论 -
糖果传递(环形均分纸牌问题)
首先看一下链式均分纸牌问题:有N堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N−1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。(思路都在代码里)const int N = 110;int n,a[N];int main()原创 2021-02-14 16:12:04 · 684 阅读 · 0 评论