数学专题

【算法专题】数论专题:组合数学 【算法专题】数论专题:组合数学引入找规律数学归纳法组合数学基本计数原理经典列题解析列题(节选)TWO.组合数学 引入 列题:兔子问题 这道题可以怎么写呢?这里有两种方法:找规律&&数学归纳法 找规律 找规律来讲就是递归: #include<bits/stdc++.h> using namespace std; int main() { int f0=1,f1=1,f... 阅读详情

判断质数

1.0 O ( n ) O(\sqrt n) O(n ​)做法

inline bool Check(const int&num)
{
	for(register int i=2;i*i<=num;++i)//n+1防止C++取整出错 
		if(num%i==0)return false;
	return true;
}

2.0 线性筛素数

bool Visit[101000];
int Prime[21000],cnt;
inline void GetPrime(const int&size)
{
	memset(Visit,false,sizeof(bool)*(size+1));cnt=0;
	Visit[0]=Visit[1]=true;
	for(int i=2;i<=size;i++)
	{
		if(!Visit[i])
			Prime[++cnt]=i;
		for(int j=1;j<=cnt;j++)
		{
			if(Prime[j]*i>size)break;
			Visit[Prime[j]*i]=true;
			if(i%Prime[j])break;
		}
	}
}

欧拉函数

1.0 O ( n ) O(\sqrt n) O(n ​)做法

inline int Phi(int n)
{
	int ans=n;
	for(int i=2;i*i<=n;i++)//小心类型溢出
		if(n%i==0)
		{
			ans=ans/i*(i-1);
			while(n%i==0)n/=i;
		}
	if(n>1)ans=ans/n*(n-1);
	return ans;
}

2.0 线性筛递推 φ ( n ) \varphi(n) φ(n)

线性筛法能递推欧拉函数是因为欧拉函数是积性函数 . . .

inline void GetPrime(const int&size)
{
	memset(Visit,false,sizeof(bool)*(size+1));cnt=0;
	Visit[0]=Visit[1]=true;Phi[1]=1;
	for(int i=2;i<=size;i++)
	{
		if(!Visit[i])
			Prime[++cnt]=i,
			Phi[i]=i-1;
		for(int j=1;j<=cnt;j++)
		{
			if(Prime[j]*i>size)break;
			Visit[Prime[j]*i]=true;
			if(i%Prime[j]==0)
			{
				Phi[i*Prime[j]]=Phi[i]*Prime[j];
				break;
			}
			Phi[i*Prime[j]]=Phi[i]*(Prime[j]-1);
		}
	}
}

欧拉定理及其推论

0.0 前言

此篇内容大部分来自<<算法竞赛进阶指南>> By 李煜东

1.0 定义

  1. 若整数 a a a和整数 b b b初一正整数 m m m的余数相等 , , ,则称 a , b a,b a,b模 m m m同余 , , ,记为 a ≡ b ( m o d   m ) . a\equiv b(mod~m). a≡b(mod m).

  2. 对于 ∀ a ∈ [ 0 , m − 1 ] , \forall a \in [0,m-1], ∀a∈[0,m−1],集合 { a + k m } ( k ∈ Z ) \{a+km\}(k \in \mathbb{Z}) {a+km}(k∈Z)的所有数模m同余 , , ,余数都是 a , a, a,该集合称为一个模m的同余类 , , ,简记为 a ‾ . \overline a . a.

  3. 对于正整数 m , m, m,有 r 1 , r 2 , r 3 , . . . . . . , r m − 2 , r m − 1 , r m r_1,r_2,r_3,......,r_{m-2},r_{m-1},r_{m} r1​,r2​,r3​,......,rm−2​,rm−1​,rm​个同余类 , , ,且两两模 m m m不同余 , , ,这些同余类所组成的集合叫做模 m m m的完全剩余系 . . .

  4. 对于模 m m m的完全剩余系从中选出与 m m m互素的同余类元素 , , ,且这些元素模 m m m两两不同余 , , ,组成模 m m m的一个简化剩余系 , , ,最终得到的剩余系中元素个数为 φ ( m ) . \varphi(m). φ(m).

2.0 性质

  1. 简化剩余系关于模 m m m乘法封闭 . . .这是因为若 a , b ( 0 < a , b ≤ m ) a,b (0\lt a,b\le m) a,b(0<a,b≤m)与 m m m互质 , , ,即 g c d ( a , m ) = g c d ( b , m ) = 1 , gcd(a,m)=gcd(b,m)=1, gcd(a,m)=gcd(b,m)=1,因为 a , b a,b a,b与 m m m都无相同因子 , , ,故 a ∗ b a∗b a∗b与 m m m也无相同因子 , , ,故 a ∗ b a*b a∗b与 m m m互质,所以 a ∗ b   m o d   m a*b~mod~m a∗b mod m也属于 m m m的简化剩余系 . . .

  2. 欧拉定理 : : :

若正整数 a , n a,n a,n互质 , , ,则 a φ ( n ) = 1 ( m o d   n ) . a^{\varphi(n)}=1(mod~n). aφ(n)=1(mod n).

设 n n n的简化剩余系为 { a 1 ‾ , a 2 ‾ , ⋯   , a φ ( n ) ‾ } . \{\overline{a_1},\overline{a_2},\cdots,\overline{a_{\varphi(n)}}\}. {a1​​,a2​​,⋯,aφ(n)​​}.对 ∀ a i , a j , \forall a_i,a_j, ∀ai​,aj​,若 a ∗ a i ≡ a ∗ a j ( m o d   n ) , a*a_i\equiv a*a_j(mod~n), a∗ai​≡a∗aj​(mod n),则 a ∗ ( a i − a j ) ≡ 0 ( m o d n ) . a*(a_i-a_j)\equiv 0(mod n). a∗(ai​−aj​)≡0(modn).因为 a , n a,n a,n互质 , , ,所以 a i ≡ a j ( m o d   n ) . a_i\equiv a_j(mod~n). ai​≡aj​(mod n).故当 a i ≠ a j a_i \not= a_j ai​​=aj​时 , a i ∗ a , a j ∗ a ,a_i*a,a_j*a ,ai​∗a,aj​∗a代表了不同的同余类.

又因为简化剩余系关于模 n n n乘法封闭 , , ,故 a a i ‾ \overline{aa_i} aai​​也在简化同余系集合中 . . .因此集合 { a 1 ‾ , a 2 ‾ , ⋯   , a φ ( n ) ‾ } \{\overline{a_1},\overline{a_2},\cdots,\overline{a_{\varphi(n)}}\} {a1​​,a2​​,⋯,aφ(n)​​}和集合 { a a 1 ‾ , a a 2 ‾ , ⋯   , a a φ ( n ) ‾ } \{\overline{aa_1},\overline{aa_2},\cdots,\overline{aa_{\varphi(n)}}\} {aa1​​,aa2​​,⋯,aaφ(n)​​}都能代表 n n n的简化剩余系 . . .

所以 : : :
a φ ( n ) a 1 a 2 ⋯ a φ ( n ) ≡ ( a a 1 ) ( a a 2 ) ⋯ ( a a φ ( n ) ) ≡ a 1 a 2 ⋯ a φ ( n ) ( m o d n ) a^{\varphi(n)}a_1a_2\cdots a_{\varphi(n)}\equiv(aa_1)(aa_2)\cdots(aa_{\varphi(n)})\equiv a_1a_2\cdots a_{\varphi(n)}(mod n) aφ(n)a1​a2​⋯aφ(n)​≡(aa1​)(aa2​)⋯(aaφ(n)​)≡a1​a2​⋯aφ(n)​(modn)
同除 a 1 a 2 ⋯ a φ ( n ) a_1a_2\cdots a_{\varphi(n)} a1​a2​⋯aφ(n)​得:
a φ ( n ) = 1 ( m o d   n ) a^{\varphi(n)}=1(mod~n) aφ(n)=1(mod n)

  1. 欧拉定理的推论

若正整数 a , n a,n a,n互质,则对于任意正整数 b , b, b,有 a b ≡ a b   m o d   φ ( n ) . a^b\equiv a^{b~mod~\varphi(n)}. ab≡ab mod φ(n).

特别地 , , ,当 a , n a,n a,n不一定互质且 b > φ ( n ) b>\varphi(n) b>φ(n)时 , , ,有 a b ≡ a b   m o d   φ ( n ) + φ ( n ) . a^b\equiv a^{b~mod~\varphi(n)+\varphi(n)}. ab≡ab mod φ(n)+φ(n).

拓展欧几里德

1.0 证明

令 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)

∵ g c d ( b , a   m o d   b ) = g c d ( a , b ) \because gcd(b,a~mod~b)=gcd(a,b) ∵gcd(b,a mod b)=gcd(a,b)

∴ a ∗ x + b ∗ y = g c d ( a , b ) = g c d ( b , a   m o d   b ) = b ∗ t x + ( a   m o d   b ) ∗ t y \therefore a*x+b*y=gcd(a,b)=gcd(b,a~mod~b)=b*tx+(a~mod~b)*ty ∴a∗x+b∗y=gcd(a,b)=gcd(b,a mod b)=b∗tx+(a mod b)∗ty

∵ a   m o d   b = a − ⌊ a / b ⌋ ∗ b \because a~mod~b=a-\lfloor a/b\rfloor*b ∵a mod b=a−⌊a/b⌋∗b

∴ a ∗ x + b ∗ y = b ∗ t x + ( a − ⌊ a / b ⌋ ∗ b ) ∗ t y \therefore a*x+b*y=b*tx+(a-\lfloor a/b\rfloor*b)*ty ∴a∗x+b∗y=b∗tx+(a−⌊a/b⌋∗b)∗ty

∴ a ∗ x + b ∗ y = a ∗ t y + b ∗ ( t x − ⌊ a / b ⌋ ∗ t y ) \therefore a*x+b*y=a*ty+b*(tx-\lfloor a/b\rfloor *ty) ∴a∗x+b∗y=a∗ty+b∗(tx−⌊a/b⌋∗ty)

∴ x = t y , y = t x − ⌊ a / b ⌋ ∗ t y \therefore x=ty,y=tx-\lfloor a/b\rfloor *ty ∴x=ty,y=tx−⌊a/b⌋∗ty

∴ a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 ) \therefore a*1+0*0=gcd(a,0) ∴a∗1+0∗0=gcd(a,0)

用数学归纳法证明

( f r o m (from (from lb学长 ) ) )

令 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)

∵ g c d ( b , a   m o d   b ) = g c d ( a , b ) \because gcd(b,a~mod~b)=gcd(a,b) ∵gcd(b,a mod b)=gcd(a,b)

∴ a ∗ x + b ∗ y = g c d ( a , b ) = g c d ( b , a   m o d   b ) = b ∗ t x + ( a   m o d   b ) ∗ t y \therefore a*x+b*y=gcd(a,b)=gcd(b,a~mod~b)=b*tx+(a~mod~b)*ty ∴a∗x+b∗y=gcd(a,b)=gcd(b,a mod b)=b∗tx+(a mod b)∗ty

∵ a   m o d   b = a − ⌊ a / b ⌋ ∗ b \because a~mod~b=a-\lfloor a/b\rfloor*b ∵a mod b=a−⌊a/b⌋∗b

∴ a ∗ x + b ∗ y = b ∗ t x + ( a − ⌊ a / b ⌋ ∗ b ) ∗ t y \therefore a*x+b*y=b*tx+(a-\lfloor a/b\rfloor*b)*ty ∴a∗x+b∗y=b∗tx+(a−⌊a/b⌋∗b)∗ty

∴ a ∗ x + b ∗ y = a ∗ t y + b ∗ ( t x − ⌊ a / b ⌋ ∗ t y ) \therefore a*x+b*y=a*ty+b*(tx-\lfloor a/b\rfloor *ty) ∴a∗x+b∗y=a∗ty+b∗(tx−⌊a/b⌋∗ty)

∴ x = t y , y = t x − ⌊ a / b ⌋ ∗ t y \therefore x=ty,y=tx-\lfloor a/b\rfloor *ty ∴x=ty,y=tx−⌊a/b⌋∗ty

现已知 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组特解 , , ,记为 x 0 , y 0 . x_0,y_0. x0​,y0​.

则有 a x 0 c g c d ( a , b ) + b y 0 c g c d ( a , b ) = c . a\frac{x_0c}{gcd(a,b)}+b\frac{y_0c}{gcd(a,b)}=c. agcd(a,b)x0​c​+bgcd(a,b)y0​c​=c.

令 x 1 = x 0 c g c d ( a , b ) , y 1 = y 0 c g c d ( a , b ) . x_1=\frac{x_0c}{gcd(a,b)},y_1=\frac{y_0c}{gcd(a,b)}. x1​=gcd(a,b)x0​c​,y1​=gcd(a,b)y0​c​.

不妨设 ∀ d ∈ Q \forall d\in Q ∀d∈Q,那么一定有 a ( x 1 + d b ) + b ( y 1 − d a ) = c . a(x_1+db)+b(y_1-da)=c. a(x1​+db)+b(y1​−da)=c.

其中 ( x 1 + d b ) , ( y 1 − d a ) ∈ Z . (x_1+db),(y_1-da)\in Z. (x1​+db),(y1​−da)∈Z.

令 d d d取最小可能正值时 , , ,设 d x = d b , d y = d a , d_x=db,d_y=da, dx​=db,dy​=da,任意解与 x 1 , y 1 x_1,y_1 x1​,y1​的偏差显然为 d x , d y d_x,d_y dx​,dy​的倍数 . . .

那么显然最小 d = 1 g c d ( a , b ) , d=\frac1{gcd(a,b)}, d=gcd(a,b)1​,

通解形式为 x = x 1 + k b g c d ( a , b ) , y = y 1 + k a g c d ( a , b ) . ( k x=x_1+\frac{kb}{gcd(a,b)},y=y_1+\frac{ka}{gcd(a,b)}.(k x=x1​+gcd(a,b)kb​,y=y1​+gcd(a,b)ka​.(k为常数 k ∈ Z ) . k\in Z). k∈Z).

( f r o m (from (from xaocy ) ) )

设 A = a g c d ( a , b ) , B = b g c d ( a , b ) A=\frac{a}{gcd(a,b)},B=\frac{b}{gcd(a,b)} A=gcd(a,b)a​,B=gcd(a,b)b​显然 : : :

{ x m i n = ( x 1 % B + B ) % B y m a x = c − a x m i n b \begin{cases} & x_{min}=(x_1\%B+B)\%B\\ & y_{max}=\frac{c-ax_{min}}{b} \end{cases} {​xmin​=(x1​%B+B)%Bymax​=bc−axmin​​​

{ y m i n = ( y 1 % A + A ) % A x m a x = c − b y m i n a \begin{cases} & y_{min}=(y_1\%A+A)\%A\\ & x_{max}=\frac{c-by_{min}}{a} \end{cases} {​ymin​=(y1​%A+A)%Axmax​=ac−bymin​​​

一个易错点 , , , 在 E x g c d Exgcd Exgcd 中 , a ,a ,a 和 b b b 都不能为负数 , , , 可以通过适当的变换使 a a a 和 b b b 变成正数 , , , 比如把负号转移到要求的 x x x 和 y y y 上 . . .

2.0 Caioj1153

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline long long Gcd(long long a,long long b)
{
	if(b==0)return a;
	return Gcd(b,a%b);
}
inline void ExGcd(long long a,long long b,long long&x,long long&y)
{
	if(b==0){x=1,y=0;return;}
	ExGcd(b,a%b,y,x);y=y-(a/b)*x;
}
long long a,b,x,y,k;
int main()
{
	scanf("%lld%lld%lld",&a,&b,&k);
	register long long d=Gcd(a,b);
	if(k%d){puts("no solution!");}
	else
	{
		ExGcd(a,b,x,y);
		printf("%lld %lld",x*k/d,y*k/d);
	}
	return 0;
}

3.0 Caioj1155

P = b 1 ( m o d   m 1 ) P = b 2 ( m o d   m 2 ) k m 1 + b 1 = P ( m o d   m 1 ) l m 2 + b 2 = P ( m o d   m 2 ) k m 1 + b 1 = l m 2 + b 2 ( m o d    l c m ( m 1 , m 2 ) ) k m 1 + ( − l ) m 2 = b 2 − b 1 ( m o d    l c m ( m 1 , m 2 ) ) P=b_1(mod~m_1)\\ P=b_2(mod~m_2)\\ km_1+b_1=P(mod~m_1)\\ lm_2+b_2=P(mod~m_2)\\ km_1+b_1=lm_2+b_2(mod~~lcm(m_1,m_2))\\ km_1+(-l)m_2=b_2-b_1(mod~~lcm(m_1,m_2)) P=b1​(mod m1​)P=b2​(mod m2​)km1​+b1​=P(mod m1​)lm2​+b2​=P(mod m2​)km1​+b1​=lm2​+b2​(mod  lcm(m1​,m2​))km1​+(−l)m2​=b2​−b1​(mod  lcm(m1​,m2​))

设得到的解为 k 0 , k_0, k0​,有 : : :

P = k 0 m 1 + b 1 ( m o d    l c m ( m 1 , m 2 ) ) P=k_0m_1+b_1(mod~~lcm(m_1,m_2)) P=k0​m1​+b1​(mod  lcm(m1​,m2​))

剩下的东西大家懂得都懂 . . .

inline long long Gcd(const long long&a,const long long&b)
{
	if(b==0)return a;
	return Gcd(b,a%b);
}
inline void ExGcd(const long long&a,const long long&b,long long&x,long long&y)
{
	if(b==0){x=1,y=0;return;}
	ExGcd(b,a%b,y,x);y-=(a/b)*x;
}
long long b1,b2,m1,m2,g,x,y;
int n;
int main()
{
	scanf("%d",&n);
	scanf("%lld%lld",&b1,&m1);
	bool Is=true;
	for(int i=2;i<=n;i++)
	{
		scanf("%lld%lld",&b2,&m2);
		//Ax+By=C,A=m1,B=-m2,C=b2-b1
		g=Gcd(m1,m2);
		if((b2-b1)%g)
		{
			Is=false;
			for(int j=i+1;j<=n;j++)
				scanf("%lld%lld",&b2,&m2);
			break;
		}
		ExGcd(m1,m2,x,y);
		x*=(b2-b1)/g;
		x=(x%(m2/g)+m2/g)%(m2/g);
		b1=x*m1+b1;
		m1=m1*m2/g;
	}
	if(Is)printf("%lld",b1);
	return 0;
}

矩阵乘法

1.0 定义

struct Matrixes
{
	unsigned long long Arr[3][3];
	int n,m;
	Matrixes(){memset(Arr,0,sizeof(Arr));}
	inline friend Matrixes operator*(const Matrixes&a,const Matrixes&b)
	{
		Matrixes c;
		for(register int i=1;i<=a.n;i++)
			for(register int j=1;j<=b.n;j++)
				for(register int k=1;k<=a.m;k++)
					c.Arr[i][j]=(c.Arr[i][j]+a.Arr[i][k]*b.Arr[k][j])%Mod;
		c.n=a.n;c.m=b.n;
		return c;
	}
};

2.0 特殊矩阵

  1. 单位矩阵

[ 1 0 ⋯ 0 0 1 ⋯ 0 ⋮ ⋮ ⋱ 0 0 0 0 1 ] \begin{bmatrix} 1&0&\cdots&0\\ 0&1&\cdots&0\\ \vdots&\vdots&\ddots&0\\ 0&0&0&1 \end{bmatrix} ⎣⎢⎢⎢⎡​10⋮0​01⋮0​⋯⋯⋱0​0001​⎦⎥⎥⎥⎤​

任何宽 ( m ) (m) (m)与其长 ( n ) (n) (n)相等的矩阵与其相乘等于原矩阵 . . .

  1. 转移矩阵和状态矩阵

以 F i b o n a c c i Fibonacci Fibonacci数列为例 , , ,

设状态矩阵 F ( n ) = [ F i b n − 1 , F i b n ] F(n)=[Fib_{n-1},Fib_n] F(n)=[Fibn−1​,Fibn​]

[ F i b n , F i b n + 1 ] = [ F i b n , F i b n − 1 + F i b n ] = [ F i b n − 1 , F i b n ] [ 0 1 1 1 ] \begin{matrix} & [Fib_n,Fib_{n+1}]\\ & =[Fib_n,Fib_{n-1}+Fib_n]\\ & =[Fib_{n-1},Fib_n] \begin{bmatrix} 0&1\\ 1&1 \end{bmatrix} \end{matrix} ​[Fibn​,Fibn+1​]=[Fibn​,Fibn−1​+Fibn​]=[Fibn−1​,Fibn​][01​11​]​

利用递推式间的和差关系能推出转移矩阵 . . .

3.0 Acwing206

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Matrixes
{
	long long Arr[70][70];int n,m;
	Matrixes(int wide=0)
	{
		n=m=wide;
		memset(Arr,0,sizeof(Arr));
		for(int i=1;i<=wide;i++)
			Arr[i][i]=1;
	}
	long long *operator[](int idx){return Arr[idx];}
	inline friend Matrixes operator*(Matrixes a,Matrixes b)
	{
		Matrixes c;
		for(register int i=1;i<=a.n;i++)
			for(register int j=1;j<=b.n;j++)
				for(register int k=1;k<=a.m;k++)
					c[i][j]+=(a[i][k]*b[k][j]);
		c.n=a.n;c.m=b.n;
		return c;
	}
};Matrixes Arr[65],Ans;
inline Matrixes Pow(Matrixes a,int n)
{
	Matrixes r(a.n);
	while(n)
	{
		if(n&1)r=r*a;
		a=a*a;n>>=1;
	}
	return r;
}
int n,m,t,act;
inline int Hash(int i,int j){return (i-1)*m+j+1;}
char St[10][10];
char Opt[10][10];
int len[10];
int main()
{
	scanf("%d%d%d%d",&n,&m,&t,&act);
	for(int i=1;i<=n;i++)
		scanf("%s",St[i]+1);
	for(int i=1;i<=act;i++)
		scanf("%s",Opt[i]+1),len[i]=strlen(Opt[i]+1);
	Ans[1][1]=1;Ans.n=1;
	Ans.m=n*m+1;
	for(int i=1;i<=60;i++)
	{
		Arr[i][1][1]=1;
		Arr[i].n=Arr[i].m=n*m+1;
		for(int j=1;j<=n;j++)
			for(int k=1;k<=m;k++)
			{
				int pos=St[j][k]-48+1;
				char opt=Opt[pos][(i-1)%len[pos]+1];
				if(opt>='0'&&opt<='9')
					Arr[i][1][Hash(j,k)]=opt-48,
					Arr[i][Hash(j,k)][Hash(j,k)]=1;//留着这些数 
				else if(opt=='N'&&j>1)
					Arr[i][Hash(j,k)][Hash(j-1,k)]=1;//把 Hash(j,k)乘到Hash(j-1,k)去 
				else if(opt=='W'&&k>1)
					Arr[i][Hash(j,k)][Hash(j,k-1)]=1;
				else if(opt=='S'&&j<n)
					Arr[i][Hash(j,k)][Hash(j+1,k)]=1;
				else if(opt=='E'&&k<m)
					Arr[i][Hash(j,k)][Hash(j,k+1)]=1;
			}
	}
	Matrixes tmp(n*m+1);
	for(int i=1;i<=60;i++)tmp=tmp*Arr[i];
	Ans=Ans*Pow(tmp,t/60);
	for(int i=1;i<=t%60;i++)Ans=Ans*Arr[i];
	long long ans=0;
	for(int i=2;i<=n*m+1;i++)ans=max(ans,Ans[1][i]);
	printf("%lld\n",ans);
	return 0;
}

高斯消元

1.0 Luogu P2455 [SDOI2006]线性方程组

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Matrixes
{
	double Arr[55][55];int n,m;
	inline double* operator[](const int&idx){return Arr[idx];}
	Matrixes(int wide=0)
	{
		n=m=wide;
		memset(Arr,0,sizeof(Arr));
		for(register int i=1;i<=wide;i++)
			Arr[i][i]=1.0;
	}
};Matrixes A;
int n;
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;++i)
		for(register int j=1;j<=n+1;j++)
			scanf("%lf",&A[i][j]);
	int now=1;//在哪条方程 
	for(register int i=1;i<=n;i++)//现在找到哪个元 
	{
		register int maxi=now;
		for(register int j=now+1;j<=n;j++)
			if(fabs(A[j][i])>fabs(A[maxi][i]))maxi=j;
		if(!A[maxi][i])continue;//这条方程无解不慌,找下一个元 
		for(register int j=1;j<=n+1;j++)
			swap(A[now][j],A[maxi][j]);//给他换上来 
		for(register int j=1;j<=n;j++)
		{
			if(j==now)continue;
			register double tmp=A[j][i]/A[now][i];//这的意思就是i这元在第j条方程里必为零 
			for(register int k=i+1;k<=n+1;k++)
				A[j][k]-=A[now][k]*tmp;
		}
		++now;
	}
	if(now<=n)
	{
		while(now<=n)
			if(A[now++][n+1]!=0)return puts("-1"),0;//老子这都没元了,还不等于零,无解了 
		return puts("0"),0;
	}
	for(register int i=1;i<=n;i++)
		printf("x%d=%.2lf\n",i,A[i][n+1]/A[i][i]+1e-9);
	return 0;
}

2.0 Acwing207

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Matrixes
{
	double Arr[25][25];int n,m;
	inline double* operator[](const int&idx){return Arr[idx];}
	Matrixes(int wide=0)
	{
		n=m=wide;
		memset(Arr,0,sizeof(Arr));
		for(register int i=1;i<=wide;i++)
			Arr[i][i]=1.0;
	}
};
inline int Gauss(Matrixes&A,int n)
{
	int now=1;//在哪条方程 
	for(register int i=1;i<=n;i++)//现在找到哪个元 
	{
		register int maxi=now;
		for(register int j=now+1;j<=n;j++)
			if(fabs(A[j][i])>fabs(A[maxi][i]))maxi=j;
		if(!A[maxi][i])continue;//这条方程无解不慌,找下一个元 
		for(register int j=1;j<=n+1;j++)
			swap(A[now][j],A[maxi][j]);//给他换上来 
		for(register int j=1;j<=n;j++)
		{
			if(j==now)continue;
			register double tmp=A[j][i]/A[now][i];//这的意思就是i这元在第j条方程里必为零 
			for(register int k=i+1;k<=n+1;k++)
				A[j][k]-=A[now][k]*tmp;
		}
		++now;
	}
	if(now<=n)
	{
		while(now<=n)
			if(A[now++][n+1]!=0)return -1;//老子这都没元了,还不等于零,无解了 
		return 0;
	}
	return 1;
}
inline double Sqr(const double&x){return x*x;}
Matrixes Arr,Qry;
int n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++)
		for(int j=1;j<=n;j++)
			scanf("%lf",&Arr[i][j]);
	for(int i=1;i<=n;i++)
	{
		//Qry[i][n+1]=0.0;
		for(int j=1;j<=n;j++){
			Qry[i][j]=2.0*(Arr[i][j]-Arr[i+1][j]),
			Qry[i][n+1]+=Sqr(Arr[i][j])-Sqr(Arr[i+1][j]);}
	}
	Gauss(Qry,n);
	for(int i=1;i<=n;i++)
		printf("%.3lf ",Qry[i][n+1]/Qry[i][i]);
	return 0;
}

3.0 Acwing208

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int Arr[110],n,t,ans,T,x,y;
int main()
{
	scanf("%d",&T);
	for(register int Test=1;Test<=T;Test++)
	{
		scanf("%d",&n);
		for(register int i=1;i<=n;i++)
			scanf("%d",&Arr[i]);
		for(register int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			Arr[i]^=x;//结束的状态和开始的状态有关,现在变成了需要的操作,等式右变成0 
			Arr[i]|=1<<i;//Arr[i][i]=1,按自己,自己也会变 
		}
		while(~scanf("%d%d",&x,&y)&&x&&y)
			Arr[y]|=1<<x;//Arr[y][x]=1,按x,y也会变 
		ans=1;
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
				if(Arr[j]>Arr[i])
					swap(Arr[i],Arr[j]);
					//找主元位最高的Arr[i] 其实就是一个一个元地消 
			if(Arr[i]==0){ans=1<<(n-i+1);break;}
			if(Arr[i]==1){ans=0;break;}
			//消去其他该位的系数 
			for(int k=n;k>=1;k--)
				if(Arr[i]>>k&1)
				{
					for(int j=1;j<=n;j++)
						if(i!=j&&(Arr[j]>>k&1))
							Arr[j]^=Arr[i];
					break;
				}
		}
		if(ans==0)puts("Oh,it's impossible~!!");
		else printf("%d\n",ans);
	}
	return 0;
}

4.0 Acwing209

精度坑 , , ,贪心细节坑 , , ,性能要求低尽量用这个

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double Eps=1e-8;
long double Arr[510][510];
long long Cost[510],ans;
int n,m;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%Lf",&Arr[i][j]);
	for(int i=1;i<=n;i++)
		scanf("%lld",&Cost[i]);
	int now=1;
	for(int i=1;i<=m;i++)
	{
		int maxi=0;
		for(int j=now;j<=n;j++)
			if(fabs(Arr[j][i])>Eps&&(maxi==0||Cost[j]<Cost[maxi]))maxi=j;
		if(maxi==0)continue;
		ans+=Cost[maxi];
		for(int j=1;j<=m;j++)
			swap(Arr[now][j],Arr[maxi][j]);
		swap(Cost[now],Cost[maxi]);
		for(int j=1;j<=n;j++)
		{
			if(j!=now&&fabs(Arr[j][i])>Eps)
			{
				long double tmp=Arr[j][i]/Arr[now][i];
				for(int k=i;k<=m;k++)
					Arr[j][k]-=tmp*Arr[now][k];
			}
		}
		now++;
	}
	printf("%d %lld",now-1,ans);
	return 0;
}

5.0 Acwing210

异或空间

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MaxN=10005;
unsigned long long Arr[MaxN];
int n,m;
int main()
{
	int Task;scanf("%d",&Task);
	for(int Case=1;Case<=Task;Case++)
	{
		printf("Case #%d:\n",Case);
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%llu",&Arr[i]);
		int tmp=n;
		bool zero=false;
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
				if(Arr[j]>Arr[i])swap(Arr[i],Arr[j]);
			if(Arr[i]==0){zero=true;tmp=i-1;break;}//有零行,记录一下,基底是1~i-1 
			for(int k=63;k>=0;k--)
				if(Arr[i]>>k&1)
				{
					for(int j=1;j<=n;j++)
						if(i!=j&&(Arr[j]>>k&1))Arr[j]^=Arr[i];
					break;
				}
		}
		scanf("%d",&m);
		while(m--)
		{
			unsigned long long k,ans=0;
			scanf("%llu",&k);
			if(zero)k--;//跳过零 
			if(k>=(1llu<<tmp))puts("-1");//只有0~2^tmp-1种选择 
			else
			{
				for(int i=tmp-1;i>=0;i--)
					if(k>>i&1)ans^=Arr[tmp-i];
				//只有0~2^tmp-1中选择,那k的二进制是什么,
                //就使其异或二进制位所对的值
				//说白了
				//如果问的是第3名
				//1001 
				//0101 
				//0010 
				//0000 
				//0000
				//那就异或 0101 0010->0111 
				//后面的自由元影响不了前面二进制位的排名 
				printf("%llu\n",ans);
			}
		}
	}
	return 0;
}

莫比乌斯函数

高中数学导数极值点偏移专题(一) 高中数学导数极值点偏移专题(一)(有电子完整版)私信领取。 今天高中数学导数极值点偏移专题(一)分享就到这里了,关注高中数学肖博老师为大家分享更多高中数学知识点和视频教程。 ... 阅读详情

相关推荐

【LeetCode系列】数学专题

数学专题 目录 数学专题 LeetCode 268 缺失数字 1、分析 2、代码 LeetCode 462 最少移动次数使数组元素相等II 1、分析 2、代码 LeetCode 458 可怜的小猪 1、分析 2、代码 LeetCode 319 灯泡开关 1、分析 2、代码 LeetCode 343 整数拆分 1、分析 2、代码 LeetCode 650 只有两个...

qq_36417014的博客 510

数学专题1

数学是好的——数学老师 在信息学中,数学依然重要!!! 为肾膜? 蒟蒻:我都知道 看看历年的曾题: NOIP2017 D1T1 小凯的疑惑 不定方程大佬(nao)一算, a*b-a-b 得解!!! AK*1,MARK+=100; NOIP2016 D2T1组合数问题 组合数学的递推+前缀和=>AK*2,MARK+=100; 虽然我听大佬说这题...

weixin_34259232的博客 297

考研数学大纲与补充专题讲义:核心复习资料

解线性代数题时,常见的方法包括矩阵运算、行列式分析、线性方程组求解等。此外,利用特征值和特征向量分析问题也是一种重要手段。例如,在处理线性变换时,可以将变换矩阵的特征值和特征向量作为一个工具来简化问题。实践是检验学习成果的唯一标准。真题实践演练是提升解题能力和速度的最佳途径。在开始实战演练前,考生需要确保自己对基础概念和定理有清晰的理解,然后通过限时解题来训练自己的思维敏捷性和时间管理能力。在进行真题练习时,可以按照考试的时间限制来模拟真实考试环境,这样有助于培养考试时的紧张感和专注度。

weixin_28729843的博客 750

数学专题(一)

数学问题总结 数论 组合计数 高斯消元 简单博弈论 一、判素数: 试除法 埃氏筛法:O(nlognlogn) 线性筛法:O(n) 二、分解质因数 试除法求约数 约数个数:INT_MAX范围内约数个数1600 约数之和 三、最大公约数(辗转相除法) 870. 约数个数 #include <iostream> #include <algorithm> #include <unordered_map> #include <vector> using names

释然的成长之路 165

QT播放器插件内嵌浏览器配合流媒体实现国标摄像头网页端播放

基本原理在浏览器⽹页中的指定播放窗口的位置和⼤⼩,实现⼀个内嵌到⽹页中显⽰的播放窗⼝,前端还必须可对这个内嵌播放窗⼝进⾏控制,⽽且播放窗⼝必须跟随浏览器窗⼝的移动和缩放、⽹页滚动、标签页切换、关闭等操作进⾏⾃动联动。播放器可以通过QT实现。这个播放窗⼝同时提供Web Socket的服务端和JSON打包命令的解析执⾏模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗⼝。

cameravision的博客 562

Navcat最新版的激活和安装教程(全网最靠谱,最快捷的方式)

现在最新版本navcat已经出到了16.3了,并且新版navcat也支持连接redis和图标等更多样化的功能,但是比较头疼的一件事就是,只能试用14天。那么接下来小编教大家如何用最简单的方式使用最新版navcat16.

weixin_50737119的博客 2万+

数学专题总结之级数

数学专题总结之级数

Ydn000的博客 477

Claude Skills 深度讲解

阶段 1:Function Call(2023)├─ 大模型可以调用外部工具├─ 问题:缺乏对任务的深度理解└─ 局限:工具调用简单线性阶段 2:MCP 上下文工程(2024)├─ 大模型有了更丰富的上下文和工具├─ 问题:仍然需要手动编写复杂的 Prompt└─ 局限:每次对话都需要重新加载上下文阶段 3:Claude Skills(2025)├─ 大模型有了「能力模块」的概念├─ 可以动态加载、组合、执行专门的工作流├─ 真正实现了「知识的模块化和复用」

u013134676的博客 1463

简单数学专题+总结

A - 质数筛 题目: Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular coach for his success. He needs some bamboos for his students, so he asked his assistant...

weixin_30955341的博客 299

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

Zephyr RTOS线程间通讯实战:消息队列与信号量的5个经典应用场景

本文深入探讨了Zephyr RTOS中线程间通讯的核心机制,通过消息队列与信号量的组合,详细解析了传感器数据处理流水线、命令分发系统、日志记录、资源池管理以及周期性任务协同调度等5个经典应用场景。这些实战模式为构建高效、稳定且可维护的嵌入式多线程系统提供了清晰的设计蓝图和代码范例。

tomato的博客 94

XTUOJ数学专题

1.1242-XTUOJAlice经常弄丢钥匙,所以她经常需要去配钥匙,但是锁匠不能保证每一把配的钥匙都能打开。Alice 不想多跑,所以她决定一次让锁匠配多把钥匙来提高成功率。假设每次配钥匙都是独立事件,锁匠有p/100 的概率配好钥匙,请问Alice要达到r/100的概率至少有一把钥匙能打开门,最少需要配多少把钥匙?输入第一行是一个整数T(0≤T≤11,000) ,表示样例数。 每个样例占一行...

qq_39088036的博客 2752

【Unity动画优化插件】BT - OptiAnimX —— AAA级动画优化框架深度剖析

BT - OptiAnimX 是一款面向 Unity 的高性能动画优化框架,核心目标是解决多角色动画场景中的性能瓶颈问题。该插件对标《战争机器5》和《巫师3》等 AAA 游戏中的动画优化技术,通过一整套自动化与智能化的优化策略,将动画性能提升与视觉质量控制结合在一起。它适用于从移动端、VR 到高端 PC 的多平台项目,尤其在“多人角色 + 高频动画”的场景中表现突出,例如 MMO、开放世界、动作游戏等。BT - OptiAnimX 本质上是一套“动画性能调度系统”,而不仅仅是优化工具。

2403_88403568的博客 433

【Java】数学专题训练

A - A^B Mod C B - 逆元 C - 判决素数个数 方法一:埃氏筛法 方法二:区间筛法 D - 矩阵乘法 E - Bash游戏 F - 取石子游戏 G - Matches Game H - 互质数的个数(一) I - Sumdiv J - The Lottery K - 组合数问题 L - 同余方程...

m0_51226527的博客 2435

基于摩尔线程 S80 显卡在 Ubuntu 系统下双卡交火部署 DeepSeek

curl -X POST -H "Content-Type: application/json" -d '{"prompt": "你的问题"}' http://localhost:11434/api/generate。curl -X POST -H "Content-Type: application/json" -d '{"prompt": "你的问题"}' http://localhost:11434/api/generate。- 为避免模型占用系统盘空间,可将模型存储路径修改到其他磁盘。

靡不有初,鲜克有终 1193

fatal: unable to access ‘https://github.com/Stability-AI/stablediffusion.git/‘解决方案

本文主要介绍在安装 stable-diffusion-webui 时出现的 fatal: unable to access 'https://github.com/Stability-AI/stablediffusion.git/': Failed to connect to github.com port 443 after 21071 ms: Couldn't connect to server 问题的解决方案,希望能对你有所帮助。

水滴的博客 5684

【CSP/信奥赛通关课(五):信奥赛数学专题】

CSP/信奥赛通关课(五):信奥赛数学专题

王老师青少年编程 1121

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言中比大小的数学题,九年级数学实数的运算及大小比较专题训练题

九年级数学实数的运算及大小比较专题训练题平时多练习,掌握好每一个知识点,考试才能有恃无恐。 以下是百分网小编精心为大家整理的初三数学实数的运算及大小比较专题训练题,希望对大家学习数学有所帮助!更多内容请关注应届毕业生网!一、选择题1.(2016·怀化)(-2)2的平方根是( C )A.2 B.-2 C.±2 D.2.(2016·深圳)下列四个数中,最小的正数是( C )A.-1 B.0 C.1 D...

weixin_34380085的博客 300

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

高中数学数列重要公式及23个典型的数列专题

高中数学数列重要公式及23个典型的数列专题(有电子完整版)私信领取。 今天高中数学数列重要公式及23个典型的数列专题分享就到这里了,关注高中数学肖博老师为大家分享更多高中数学知识点和视频教程。 ...

yan59966的博客 804

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

训练指南——数学专题一的总结

差不多一个星期过去了,在这一个多星期里,我做了一个数学专题和两场训练赛,要说对自己的感觉,只能说很差劲,开始的时候以为环境会比现在宽松很多,后来才发现想法是错误的,实验室室里室一种紧张的气氛,感觉就像稍微不努力就会,就会被落在后面,确实,在这种紧张的氛围之下,收获会不少,当然也暴漏了许多大大小小的问题,这是以前所没有预料到的!     <span style="font-size:12.0pt;

坚持不懈 485

LeetCode打卡--数学专题

文章目录数学专题LeetCode 268. Missing NumberLeetCode 62. Unique PathsLeetCode 462. Minimum Moves to Equal Array Elements IILeetCode 458. Poor PigsLeetCode 319. Bulb SwitcherLeetCode 343. Integer BreakLeetCode...

The blog of XMAN 1016

高中数学专题总结98页!超详总结,吃透数学成绩不下120!

数学要想考到120分,很简单的! 1.看课本,认真看课本,最好把每个公式的推到过程自己演练一遍,争取把它们记到骨子里去。做课本的例题,课本上的题思路比较简单,知识点也很单一,把课本上的例题你拿出来都会做了,说明你已经具备了一定的理解力。做课后练习题,前面的题是和课本例题一个级别的,如果课本上所有的题都会做了,基础夯实就算行了。 2.开始专题训练,可以从以下几方面考虑,如三角函数、立体几何、数列、统计、导数和圆锥曲线等。专题怎么练呢?重头戏来了,我为高中的同学准备了《高中数学专题知识要点及解题方法精粹》,先是

yujiangaozhongs的博客 444

CSP数学专题

通常这些类型可以从算法的上下文来看是清楚的,并不需要额外加以说明比如:整型(1,2,166),浮点型(1.23,3.1415),字符串(“helloworld”),字符(A,F),布尔型(True,False)1.集合的“并”运算对应于常见数学逻辑用语中的“或”,所以二者的符号也比较相像 (并:U,或:V),开口方向都向上。2.集合的“交”运算对应于常见数学逻辑用语中的“且”运算,二者的符号比较相像(交:n,且:∧),开口方向都向下。自然对数函数用符号“In”表示,以常数e(自然对数的底)为底的对数函数。

我喜欢代码,并不是喜欢代码本身,而是喜欢把心融入代码,找寻其中的真理 2707

考研数学专题

qq_39690007的博客 167
上一篇: 匹配专题
下一篇: 字符串专题
DarksideCoder
博客等级 码龄7年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值