数论基础知识和模板

质数筛

用于快速处理 1~n 中所有素数的算法

因为依次遍历判断每一个数是否质数太慢,所以把一些明显不能质数的筛出来

普通筛法,对于每个整数,删除掉其倍数。

bool vis[N];//0表示是质数
int pri[N],o; //质数表
void get(int n) {vis[1] = true; //1不是素数for(int i = 2; i <= n; ++i) {//从2开始if(!vis[i])pri[++o] = i; //加入质数表for(int j = 2 * i; j <= n; j += i)vis[j] = 1;//删除到n的整数倍}
}

线性筛和埃氏筛-CSDN博客

埃氏筛

在普通筛法的过程中,发现筛 4 的倍数毫无意义,因为 4 的倍数肯定已被 2 的倍数筛过了,所以优化方法是只用质数去筛。

 对于每一个整数,只有他是质数时才去筛

if(!vis[i]){
            primes[ ++ tot] = i; 
            for(int j = 2 * i; j <= n; j += i)
                vis[j] = 1;//进入if里了

        }

线性筛(欧拉

让每个数都被其最小的质因数筛掉,故一个数只被筛一次,复杂度为O(n)

实现就是,对于每个数,我们都将他对整个现在已有的质数表筛一遍,比如3是质数,那么把已有的2相乘,筛掉6,但是并不往下进行,因为比如12,最小质数因数是3,在遍历到4时自然而然就筛掉了,这样每个数就只会被他最小质因数筛掉一次,达到了线性

for(int i = 2; i <= n; ++i) {if(!vis[i]) //是素数pri[ ++ o] = i;for(int j=1;j<o;j++)if(i*pri[j]<=n)vis[i*pri[j]]=1;else break;//}
}

快速幂:

1. 基本概念

一个在O(logn)的时间内计算an的魔术技巧小技巧,而暴力的计算需要O(n)的时间,基本思想就是将指数按照二进制表示来分割。例如

ll ksm(ll a,ll b,ll p){ll ans=1;while(b){if(b&1) ans=ans*a%p;//b & 1:用按位与运算判断 b 的二进制最低位是否为 1(比如 b=5 是 101,b&1 结果为 1;b=4 是 100,b&1 结果为 0 )。
如果最低位是 1,说明当前这一位对应的幂次需要乘到结果里。
ans = ans * a % p:把当前的 a(对应某一 “二进制位权” 的幂)乘到结果 ans 中,再对 p 取模,保证数值不会溢出,且符合题目对结果取模的要求。a=a*a%p;//每次循环,底数 a 自乘一次(即 a = a² % p ),对应指数二进制位的位权翻倍。
比如初始 a=3(对应 3 1),第一次自乘后 a=3²=9(对应 3 2 ),第二次自乘后 a=9²=81(对应 3 4),第三次自乘后 a=81²=6561(对应 3 8 )…… 以此类推,刚好匹配指数二进制各位的权值b>>=1;//后移}return ans;
}
  • a:底数,即要做幂运算的基数。
  • b:指数,即幂次。
  • p:模数,计算结果要对 p 取模,避免数值过大溢出或满足题目对结果范围的要求。

 

2. 矩阵快速幂

矩阵快速幂 = 矩阵乘法 + 快速幂。

单位矩阵是对角线全为 1,其他位置均为 0 的矩阵,记为 I,性质:A×I=A。

include <iostream>
#include <cstring>
using namespace std;typedef long long LL;         // 使用LL作为long long的别名,简化代码
const int MOD = 1e9 + 7;      // 定义模数,防止整数溢出
const int N = 105;            // 定义矩阵的最大尺寸int n;                        // 矩阵的实际大小
LL k;                         // 矩阵需要乘方的次数// 矩阵结构体,封装矩阵乘法和单位矩阵设置操作
struct Matrix {LL a[N][N];               // 存储矩阵元素// 默认构造函数,初始化矩阵为全0Matrix() {memset(a, 0, sizeof a);}// 重载乘法运算符,实现矩阵乘法Matrix operator*(const Matrix& b) const {Matrix c;// 三层循环实现矩阵乘法,注意取模防止溢出for (int i = 1; i <= n; i++)for (int k = 1; k <= n; k++)for (int j = 1; j <= n; j++)c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j]) % MOD;return c;}// 设置当前矩阵为单位矩阵(对角线为1,其余为0)void setIdentity() {for (int i = 1; i <= n; i++) a[i][i] = 1;}
};int main() {cin >> n >> k;  // 输入矩阵大小n和幂次k// 读取原始矩阵Matrix base;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> base.a[i][j];// 初始化结果矩阵为单位矩阵,相当于数值计算中的1Matrix res;res.setIdentity();// 快速幂算法:计算矩阵的k次幂// 原理与数值快速幂相同,但使用矩阵乘法代替数值乘法while (k) {if (k & 1) res = res * base;  // 如果当前位为1,则乘上当前的basebase = base * base;            // base平方k >>= 1;                       // k右移一位,相当于除以2}// 输出结果矩阵for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++)cout << res.a[i][j] << ' ';cout << endl;}return 0;
}

 

 

  扩展欧几里得算法

 一、核心目标:求解 ax + by = gcd(a, b) 的整数解

扩展欧几里得算法本质是 在求最大公约数(gcd)的同时,找到满足 ax + by = gcd(a, b) 的整数 x 和 y 。
比如:a=5, b=3,gcd 是 1,同时能找到 x=2, y=-3(因为 5×2 + 3×(-3) = 10-9=1 = gcd(5,3) )。


 二、递归推导:从 gcd(b, a%b) 反推 gcd(a, b) 的解

欧几里得算法的核心是 gcd(a, b) = gcd(b, a%b)(比如 gcd(5,3)=gcd(3,2)=gcd(2,1)=gcd(1,0)=1 )。
扩展欧几里得在此基础上,递归地从 gcd(b, a%b) 的解,反推 gcd(a, b) 的解

ll exgcd(ll a, ll b, ll &x, ll &y){ // 传引用修改 x、yif(b == 0){ // 递归出口:b=0时,gcd是a,解为x=1, y=0x = 1; y = 0; return a; }// 递归求解 gcd(b, a%b),同时得到子问题的解 (x', y')ll d = exgcd(b, a % b, y, x); // 注意:这里交换了 y、x 的位置!// 子问题的解是 (x', y'),但因为交换了参数,实际拿到的是 y=x', x=y' // 根据推导公式,当前层的 y = x' - (a/b)*y' y -= (a / b) * x; return d; // 返回 gcd(a,b)
}

以 a=5, b=3 为例,逐步看递归和求解过程:

  1. 第一层调用exgcd(5, 3, x, y)

    • b≠0,递归调用 exgcd(3, 5%3=2, y, x)
  2. 第二层调用exgcd(3, 2, y, x)

    • b≠0,递归调用 exgcd(2, 3%2=1, y, x)
  3. 第三层调用exgcd(2, 1, y, x)

    • b≠0,递归调用 exgcd(1, 2%1=0, y, x)
  4. 第四层调用exgcd(1, 0, y, x)

    • b=0,触发递归出口:x=1, y=0,返回 d=1(即 gcd=1 )
  5. 返回第三层

    • 此时 d=1,且因为参数交换,当前层的 y 是子问题的 x=1x 是子问题的 y=0
    • 执行 y -= (2/1)*x → y = 0 - 2*1 = -2
    • 返回 d=1,当前层的解是 x=0, y=-2 不对?别急,继续看… 其实这里的 x,y 是相对于当前层 a=2, b=1 的, 哦,因为参数交换后,逻辑需要再仔细看

    实际第三层的调用是 exgcd(2, 1, y, x),所以子问题(第四层)的 x=1, y=0 会被赋值给 当 前层的 y 和 x ,即:

    • 当前层(第三层)的 y = 子问题的 x=1
    • 当前层(第三层)的 x = 子问题的 y=0
      然后执行 y -= (2/1)*x → y = 1 - 2*0 = 1
      所以第三层的解是 x=0, y=1,对应等式 2*0 + 1*1 = 1 = gcd(2,1),正确!
  6. 返回第二层

    • 第二层调用是 exgcd(3, 2, y, x),子问题(第三层)返回 d=1,且当前层的 y = 第三层的 x=0x = 第三层的 y=1
    • 执行 y -= (3/2)*x → 3//2=1,所以 y = 0 - 1*1 = -1
    • 此时第二层的解是 x=1, y=-1,对应等式 3*1 + 2*(-1) = 3-2=1 = gcd(3,2),正确!
  7. 返回第一层

    • 第一层调用是 exgcd(5, 3, x, y),子问题(第二层)返回 d=1,且当前层的 y = 第二层的 x=1x = 第二层的 y=-1
    • 执行 y -= (5/3)*x → 5//3=1,所以 y = 1 - 1*(-1) = 2
    • 此时第一层的解是 x=-1, y=2,对应等式 5*(-1) + 3*2 = -5+6=1 = gcd(5,3),正确!

最终,exgcd(5,3,x,y) 执行后,x=-1, y=2,满足 5*(-1) + 3*2 = 1 。

 

乘法逆元

1. 基本概念

更准确的来说是模意义下的乘法逆元。单位元:在一个集合中,对于某种运算∗,如果对于任何的集合元素 a,和元素 e 运算,得到还是集合元素 a 本身,则称 e 为这个运算下的单位元。例如加法运算的单位元是 0,乘法的单位元是 1。逆元:在一个集合中,对于某种运算∗,如果任意两个元素的运算结果等于单位元,则称这两个元素互为逆元。加法中 a 的逆元是 - a,乘法中 a 的逆元是a1​即a−1。所以,数学上的乘法逆元就是直观上的倒数,即ax=1,x 即为 a 的逆元。对于模意义下的乘法逆元,即满足ax≡1(modb)时,则称 x 为 a 关于模 b 的逆元。

很容易看出来,这是扩展欧几里得的一种运用 

扩展欧几里得法

ax≡1(modb)⇒ax+by=1

 但是利用以上的欧几里得,我们只能求出最近的一个乘法逆元,比如3m10,得到-3;

此时,应该进行魔术技巧

x = (x % n + n) % n

操作,把不论正负,求取最小正数逆元

费马小定理法

定义:若 p 为质数,gcd(a,p)=1,则ap−1≡1 (mod p)。

证明:

  • 因为ax≡1(modb)
  • 所以ax≡ab−1(modb)
  • 故x≡ab−2(modb)

然后就可以用快速幂求解,时间复杂度为O(logb)。 

ll inv(ll a,ll p){return ksm(a,p-2,p);//ksm上面呢
}

线性求逆元

求出 1-n 中每个数的逆元。

void getinv(ll n){inv[1] = 1;for(int i = 2; i <= n; ++i){inv[i] = (p - (p / i)) * inv[p % i] % p;}
}

 

线性求逆元的递推公式

对于任意一个数 i,它的逆元 inv[i] 可以通过如下递推公式计算得出

inv[i]=(p−⌊p/i⌋)×inv[p%i]%p

推导:

        我们令 k=⌊p/i⌋ 以及 r=p%i,那么显然有 p=k×i+r,也就是 k×i+r≡0(modp)。

        对这个同余式进行变形,在等式两边同时乘以 i−1×r−1,就可以得到 k×r−1+i−1≡0(modp)。

        进一步移项,就能得到 i−1≡−k×r−1(modp)。

        为了保证逆元是正数,我们把公式调整为 i−1≡(p−k)×r−1(modp),这里的 r 其实就是 p%i。

递推的起始条件
当 i 等于 1 时,它的逆元毫无疑问是 1,即 inv[1]=1,这是整个递推过程的起点。

 

组合数学 

基本求法

ll res[N][N];//记忆化,避免重复计算
ll C(ll n,ll m){if(m ==0 || n == m) return 1;if(res[n][m])return res[n][m];//调用记忆return res[n][m] = C(n - 1, m) + C(n - 1, m - 1);
}

也可以将记忆化演变成动态规划

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){ll n, m, p;cin>>n>>m>>p;ll total = n + m;vector<vector<ll>> C(total + 1, vector<ll>(total + 1, 0));        // 预处理组合数for(int i = 0; i <= total; i++){C[i][0] = 1 % p;C[i][i] = 1 % p;for(int j = 1; j < i; j++){C[i][j] = (C[i-1][j] + C[i-1][j-1]) % p;}cout<<C[total][n]<<endl;return 0;
}

ps:面对过大数据空间会炸 

 

Lucas 定理 

ll Lucas(ll n, ll m){if(m == 0) return 1;return Lucas(n / p, m / p) * C(n % p, m % p) % p;
}

 逆元法求组合(利用费马

由于公式

我们想,能不能直接利用阶乘自己取模后相除

但是当需要计算 C(n,m)modp 时,不能直接对分子和分母分别取模后相除,因为模运算的除法不满足分配律

逆元的作用是将模意义下的除法转换为乘法

(ps,-1不是次方,是逆元的意思)

ll comb(ll n, ll m, ll p) {//这里n上,m下if (m < 0 || m > n) return 0;// 预处理阶乘数组vector<ll> fact(n + 1, 1);for (ll i = 1; i <= n; i++) {fact[i] = fact[i - 1] * i % p;}// 计算逆元:fact[m]^(-1) 和 fact[n-m]^(-1)ll inv_m = mod_pow(fact[m], p - 2, p);ll inv_nm = mod_pow(fact[n - m], p - 2, p);//费马// 计算组合数return fact[n] * inv_m % p * inv_nm % p;
}

 卢卡斯与逆元结合

include <bits/stdc++.h>
using namespace std;typedef long long ll;// 快速幂计算 a^b % p
ll quick_pow(ll a, ll b, ll p) {ll res = 1;while (b > 0) {if (b & 1) res = res * a % p;a = a * a % p;b >>= 1;}return res;
}// 计算组合数 C(a, b) % p,其中 a < p,b < p
ll comb(ll a, ll b, ll p) {if (b < 0 || b > a) return 0;if (b == 0 || b == a) return 1;// 预处理阶乘和逆元vector<ll> fact(p), inv_fact(p);fact[0] = 1;for (int i = 1; i < p; ++i) {fact[i] = fact[i - 1] * i % p;}inv_fact[p - 1] = quick_pow(fact[p - 1], p - 2, p);for (int i = p - 2; i >= 0; --i) {inv_fact[i] = inv_fact[i + 1] * (i + 1) % p;}return fact[a] * inv_fact[b] % p * inv_fact[a - b] % p;
}// 卢卡斯定理计算 C(n, m) % p
ll lucas(ll n, ll m, ll p) {if (m == 0) return 1;return comb(n % p, m % p, p) * lucas(n / p, m / p, p) % p;
}int main() {ios::sync_with_stdio(false);cin.tie(0);int T;cin >> T;while (T--) {ll n, m, p;cin >> n >> m >> p;// 计算 C(n+m, n) % pcout << lucas(n + m, n, p) << '\n';}return 0;
}

卡特兰数 

 catalan数-CSDN博客

 

排列组合与容斥原理

1. 排列数公式

  • 从 n 个元素中选 m 个排列:Anm​=n×(n−1)×⋯×(n−m+1)=n!/(n−m)!​。

2. 容斥原理基础

  • 两个集合:∣A∪B∣=∣A∣+∣B∣−∣A∩B∣。
  • 三个集合:∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣A∩C∣−∣B∩C∣+∣A∩B∩C∣。
  • 应用场景:计算不满足某些条件的元素个数,如求 1~n 中不被 2、3、5 整除的数的个数。

 

快速傅里叶变换(FFT)

1. 核心作用

  • 加速多项式乘法,将暴力O(n2)的复杂度优化到O(nlogn)。
  • 原理:利用复数单位根的性质,将多项式从系数表示转为点值表示,相乘后再逆变换回系数表示。

2. 基本步骤

  1. 预处理单位根:计算复数域上的 n 次单位根
  2. FFT 正变换(DFT):将多项式转换为点值形式。
  3. 点值相乘:对应点值相乘得到结果多项式的点值表示。
  4. 逆变换(IDFT):转换回系数形式

 框架(搞不懂,看不懂,不明白,所以就贴了个码)

const double PI = acos(-1);
struct Complex {double x, y;Complex(double x=0, double y=0) : x(x), y(y) {}
};
Complex operator+(Complex a, Complex b) { return Complex(a.x+b.x, a.y+b.y); }
Complex operator-(Complex a, Complex b) { return Complex(a.x-b.x, a.y-b.y); }
Complex operator*(Complex a, Complex b) { return Complex(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x); }void fft(Complex *a, int n, int inv) {if (n == 1) return;Complex a1[n/2], a2[n/2];for (int i = 0; i < n; i++) {if (i % 2 == 0) a1[i/2] = a[i];else a2[i/2] = a[i];}fft(a1, n/2, inv); fft(a2, n/2, inv);Complex w(1, 0), wn(cos(2*PI/n), inv*sin(2*PI/n));for (int i = 0; i < n/2; i++) {a[i] = a1[i] + w * a2[i];a[i+n/2] = a1[i] - w * a2[i];w = w * wn;}if (inv == -1) {for (int i = 0; i < n; i++) a[i].x /= n;}
}// 计算多项式乘法c = a * b,a和b的次数分别为n和m
void multiply(ll *a, ll *b, ll *c, int n, int m) {int len = 1;while (len < n + m) len <<= 1;Complex *fa = new Complex[len], *fb = new Complex[len];for (int i = 0; i < n; i++) fa[i] = Complex(a[i], 0);for (int i = n; i < len; i++) fa[i] = Complex(0, 0);for (int i = 0; i < m; i++) fb[i] = Complex(b[i], 0);for (int i = m; i < len; i++) fb[i] = Complex(0, 0);fft(fa, len, 1); fft(fb, len, 1);for (int i = 0; i < len; i++) fa[i] = fa[i] * fb[i];fft(fa, len, -1);for (int i = 0; i < n + m; i++) c[i] = (ll)(fa[i].x + 0.5);delete[] fa; delete[] fb;
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913380.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04.6桌面版系统盘制作与安装

概述 本教程讲述Ubuntu20.04.6桌面版的系统U盘制作与安装&#xff0c;所需工具为一台电脑、大于4G的U盘、一个需要安装Ubuntu系统的主机。 步骤1&#xff1a;下载系统镜像与rufus 在ubuntu官网下载 ubuntu-20.04.6-desktop-amd64.iso&#xff0c;如图 下载rufus工具&#xf…

【C++复习3】类和对象

1.3.1.简述一下什么是面向对象回答&#xff1a;1. 面向对象是一种编程思想&#xff0c;把一切东西看成是一个个对象&#xff0c;比如人、耳机、鼠标、水杯等&#xff0c;他们各 自都有属性&#xff0c;比如&#xff1a;耳机是白色的&#xff0c;鼠标是黑色的&#xff0c;水杯是…

数据结构之二叉平衡树

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

Maven引入第三方JAR包实战指南

要将第三方提供的 JAR 包引入本地 Maven 仓库&#xff0c;可通过以下步骤实现&#xff08;以 Oracle JDBC 驱动为例&#xff09;&#xff1a;&#x1f527; 方法 1&#xff1a;使用 install:install-file 命令&#xff08;推荐&#xff09;定位 JAR 文件 将第三方 JAR 包&#…

JavaSE -- 泛型详细介绍

泛型 简介 集合存储数据底层是利用 Object 来接收的&#xff0c;意思是说如果不对类型加以限制&#xff0c;所有数据类型柔和在一起&#xff0c;这时如何保证数据的安全性呢&#xff08;如果不限制存入的数据类型&#xff0c;任何数据都能存入&#xff0c;当我们取出数据进行强…

使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南

文章大纲&#xff1a; 引言&#xff1a;什么是 ETL 以及其重要性 ETL&#xff08;提取-转换-加载&#xff09;是数据处理领域中的核心概念&#xff0c;代表了从源数据到目标系统的三个关键步骤&#xff1a;**提取&#xff08;Extract&#xff09;**数据、**转换&#xff08;Tra…

selenium基础知识 和 模拟登录selenium版本

前言 selenium框架是Python用于控制浏览器的技术,在Python爬虫获取页面源代码的时候,是最重要的技术之一,通过控制浏览器,更加灵活便捷的获取浏览器中网页的源代码。 还没有安装启动selenium的同志请先看我的上一篇文章进行配置启动 和 XPath基础 对selenium进行浏览器和驱动…

JS 网页全自动翻译v3.17发布,全面接入 GiteeAI 大模型翻译及自动部署

两行 js 实现 html 全自动翻译。 无需改动页面、无语言配置文件、无 API Key、对 SEO 友好&#xff01; 升级说明 translate.service 深度绑定 GiteeAI 作为公有云翻译大模型算力支持translate.service 增加shell一键部署后通过访问自助完成GiteeAI的开通及整个接入流程。增加…

数据结构:数组:插入操作(Insert)与删除操作(Delete)

目录 插入操作&#xff08;Inserting in an Array&#xff09; 在纸上模拟你会怎么做&#xff1f; 代码实现 复杂度分析 删除操作&#xff08;Deleting from an Array&#xff09; 在纸上模拟一下怎么做&#xff1f; 代码实现 复杂度分析 插入操作&#xff08;Inserti…

Qt之修改纯色图片的颜色

这里以修改QMenu图标颜色为例,效果如下: MyMenu.h #ifndef MYMENU_H #define MYMENU_H#include <QMenu>class MyMenu : public QMenu { public:explicit MyMenu(QWidget *parent = nullptr);protected:void mouseMoveEvent(QMouseEvent *event) override; };#endif /…

uni-app实现单选,多选也能搜索,勾选,选择,回显

前往插件市场安装插件下拉搜索选择框 - DCloud 插件市场&#xff0c;该插件示例代码有vue2和vue3代码 是支持微信小程序和app的 示例代码&#xff1a; <template><view><!-- 基础用法 --><cuihai-select-search:options"options"v-model&quo…

【机器学习深度学习】 微调的十种形式全解析

目录 一、为什么要微调&#xff1f; 二、微调的 10 种主流方式 ✅ 1. 全参数微调&#xff08;Full Fine-tuning&#xff09; ✅ 2. 冻结部分层微调&#xff08;Partial Fine-tuning&#xff09; ✅ 3. 参数高效微调&#xff08;PEFT&#xff09; &#x1f538; 3.1 LoRA&…

信刻光盘安全隔离与文件单向导入/导出系统

北京英特信网络科技有限公司成立于2005年&#xff0c;是专业的数据光盘摆渡、刻录分发及光盘存储备份领域的科技企业&#xff0c;专注为军队、军工、司法、保密等行业提供数据光盘安全摆渡、跨网交换、档案归档检测等专业解决方案。 公司立足信创产业&#xff0c;产品国产安全可…

Python-标准库-os

1 需求 2 接口 3 示例 4 参考资料 在 Python 中&#xff0c;os&#xff08;Operating System&#xff09;模块是一个非常重要的内置标准库&#xff0c;提供了许多与操作系统进行交互的函数和方法&#xff0c;允许开发者在 Python 程序中执行常见的操作系统任务&#xff0c;像文…

OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个设备端内联模板函数&#xff0c;用于在 GPU 上执行类似于 std::copy 的操作&#xff…

Vue Router 中$route.path与 params 的关系

1. params 参数的本质&#xff1a;路径的动态片段在 Vue Router 中&#xff0c;params 参数是通过路由配置的动态路径片段定义的&#xff0c;例如&#xff1a;// 路由配置{ path: /user/:id, component: User }当访问/user/123时&#xff0c;/user/123是完整的路径&#xff0c;…

React 极简响应式滑块验证组件实现,随机滑块位置

&#x1f3af; 滑块验证组件 (Slider Captcha) 一个现代化、响应式的滑块验证组件&#xff0c;专为 React 应用设计&#xff0c;提供流畅的用户体验和强大的安全验证功能。 ✨ 功能特性 &#x1f3ae; 核心功能 智能滑块拖拽 – 支持鼠标和触摸屏操作&#xff0c;响应灵敏随…

STM32第十六天蓝牙模块

一&#xff1a;蓝牙模块HC-05 1&#xff1a;硬件引脚配置&#xff1a; | 标号 | PIN | 说明 | |------|-------|---------------------------------------| | 1 | START | 状态引出引脚&#xff08;未连接/连接输出信号时&#xff09; |…

时序数据库IoTDB用户自定义函数(UDF)使用指南

1. 编写UDF时序数据库IoTDB为用户提供了编写UDF的JAVA API&#xff0c;用户可以自主实现UDTF&#xff08;用户自定义转换函数&#xff09;类&#xff0c;IoTDB将通过类加载机制装载用户编写的类。Maven依赖如果使用Maven&#xff0c;可以从Maven库中搜索以下依赖&#xff0c;并…

Linux国产与国外进度对垒

Linux国产与国外进度对垒 引言国产Linux的发展现状国外Linux的发展现状技术对比国产Linux的挑战与机遇国外Linux的优势与局限结论 引言 简述Linux在全球操作系统市场中的地位国产Linux的发展背景与意义国外主流Linux发行版的现状 国产Linux的发展现状 主要国产Linux发行版介…