数论简单问题

news2025/7/16 6:31:15

数论基本问题

  • 约数个数问题
  • 约数之和问题
  • 1-n中所有1-n因子的数量
  • n!分解后某个质因子的个数
  • 欧拉函数
    • 公式法求欧拉函数
    • 线性筛求欧拉函数
    • 欧拉函数在线性筛中的三种情况:
    • 欧拉定理
  • 逆元
    • 费马定理求逆元
    • 快速幂求逆元
  • 扩展欧几里得算法
    • 扩展欧几里得算法证明
    • 扩展欧几里得的应用
  • 中国剩余定理
  • 高斯消元
    • 高斯消元简介
    • 解的情况
    • 算法的步骤
    • 算法的实现
  • 组合数学(组合数求法)
    • 杨辉三角求组合数
    • 通过公式来求
    • 卢卡斯定理
    • 通过质因数分解来求
  • 卡特兰数
  • 持续更新中~~~~~~~~

约数个数问题

(1+a1) * (1+a2) * (1+a3) * ……其中a1,a2,……,a3表示的是将原数分解成质数之积的指数。
题目链接
AC代码:

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

typedef long long LL;

const int N = 110, mod = 1e9 + 7;

int main()
{
    int n;
    cin >> n;

    unordered_map<int, int> primes;

    while (n -- )
    {
        int x;
        cin >> x;
        for (int i = 2; i <= x / i; i ++ )
            while (x % i == 0)
            {
                x /= i;
                primes[i] ++ ;
            }

        if (x > 1) primes[x] ++ ;
    }

    LL res = 1;
    for (auto p : primes) res = res * (p.second + 1) % mod;

    cout << res << endl;

    return 0;
}

约数之和问题

(p1 ^ 0 + p1 ^ 1 + p1 ^ 2 +……+ p1 ^ a1) * …… 一直乘到(pk ^ 0 + pk ^ 1 + pk ^ 2 + pk ^ 3 + …… + pk ^ ak)
题目链接
AC代码:

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

typedef long long LL;

const int N = 110, mod = 1e9 + 7;

int main()
{
    int n;
    cin >> n;

    unordered_map<int, int> primes;

    while (n -- )
    {
        int x;
        cin >> x;

        for (int i = 2; i <= x / i; i ++ )
            while (x % i == 0)
            {
                x /= i;
                primes[i] ++ ;
            }

        if (x > 1) primes[x] ++ ;
    }

    LL res = 1;
    for (auto p : primes)
    {
        LL a = p.first, b = p.second;
        LL t = 1;
        while (b -- ) t = (t * a + 1) % mod;
        res = res * t % mod;
    }

    cout << res << endl;
    return 0;
}

1-n中所有1-n因子的数量

1 - n 中所有因子个数是:n/1 + n/2 + n/3 + n/4 + n/5 + …… +n/n

int res=0;
for(int i=1;i<=n;i++) res+=n/i; 

n!分解后某个质因子的个数

int get(int n, int p)
{
    int res = 0;
    while (n)
    {
        res += n / p;
        n /= p;
    }
    return res;
}

这个方法还是挺神奇的,证明的我还不会,后面会了再更新~~

欧拉函数

1-n中与n互斥的个数,设p1,p2,p3,……,pk为n的因子,所以我们直接将n - n/p1 - n/p2 - n/p3 + n / (p1*p2) + ……后面就是容斥原理,奇负偶正了。将式子整理可得
原式=n * (1 - 1/p1) * (1 - 1/p2) * …… * (1- 1 / pk) (根据容斥原理证明)

注:与次数没有关系,如果一个数被分解成2 ^ 100 * 3 ^ 100,这种情况下仍然为 N * (1-1 / 2) * (1 - 1 / 3)

公式法求欧拉函数

#include <iostream>

using namespace std;


int phi(int x)
{
    int res = x;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res = res / i * (i - 1);//注:这里一定是先除再乘,否则计算过程中可能会出现小数,而此公式计算结果一定是整数的,而且这里如果如果先乘再除的话可能会爆int,尽量先除再乘,这也是经常处理大数据常用的方法。
            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 >> x;
        cout << phi(x) << endl;
    }

    return 0;
}

线性筛求欧拉函数

void get_eulers(int n)
{
    euler[1] = 1;
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i])
        {
            primes[cnt ++ ] = i;
            euler[i] = i - 1;//如果数本来是质数,直接就是i-1。
        }
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            int t = primes[j] * i;
            st[t] = true;
            if (i % primes[j] == 0)
            {
                euler[t] = euler[i] * primes[j];//如果当前到了i的最小质因子,那么我们发现i * prime[j]实际上的含有的质因子和i是一样的,因为i与i * prime[j]都含有i含有的全部质数和prime[j]而i中含有prime[j]所以两者的欧拉函数值除了N以外是一样的,故公式就是如上
                break;
            }
            euler[t] = euler[i] * (primes[j] - 1);//如果mod不为0的情况下,i*prime[j] 中不仅含有i中全部的质因子,还含有prime[j],所以euler[t]=euler[i]*(1-1/prime[j])*prime[j],化简可以得:euler[t]=euler[i] * (prime[j]-1),这里一定是要化简的,因为euler中的所有值都是整数。
        }
    }
}

欧拉函数在线性筛中的三种情况:

1:如果当前数本来是质数,直接就是euler[i] = i-1。
2:如果当前到了i的最小质因子,那么我们发现i * prime[j]实际上的含
有的质因子和i是一样的,因为i与i * prime[j]都含有i含有的全部质数和prime[j]而i中含有prime[j]所以两者的欧拉函数值除了N以外是一样的,故公式就是如上

3:如果mod不为0的情况下,i * prime[j] 中不仅含有i中全部的质因子,还含有prime[j] 所以euler[t]=euler[i] * (1 - 1 / prime[j]) * prime[j] ,化简可以得:euler[t]=euler[i] * (prime[j]-1),这里一定是要化简的,因为euler中的所有值都是整数。

欧拉定理

如果a与n互质,那么a ^ (f(n)) mod n = 1 ,那么a * a(f(n)-1) mod n = 1, 我们这里可以看到 a^(f(n)-1) 即为a的逆元,所以欧拉函数可以用来求逆元(这里要求是a与n是互质的)

逆元

费马定理求逆元

费马定理:费马定理是欧拉定理的一种特殊情况,如果a,p互质且p为质数,那么f§ = p-1,即a ^ (p-1) mod p = 1,我们把a提取出来,则a * a ^ (p-2) mod p =1,a ^ (p-2) 即为a在模p下的逆元。

费马小定理:除以一个数等于乘以这个数的逆元: a p − 1 a^{p-1} ap1 ≡ \equiv 1(mod p),(a,p互质),我们发现 a p − 2 a^{p-2} ap2相当于1/a在mod p操作下。

费马大定理: x n + y n = z n x^{n}+y^{n}=z^{n} xn+yn=zn在n>2的时候没有正整数解,下面我们分类:
n=0:x=0,y=0,z=0是解
n=1:x+y=z,很多解
n=2:勾股数
n>2:无正整数解
构造勾股数:
(1) 2 n + 1 2n+1 2n+1 2 n 2 + 2 n 2n^{2}+2n 2n2+2n 2 n 2 + 2 n + 1 2n^{2}+2n+1 2n2+2n+1(n为正整数)是一组勾股数。
(2) 2 ( n + 1 ) 2(n+1) 2(n+1) n 2 + 2 n n^{2}+2n n2+2n n 2 + 2 n + 2 n^{2}+2n+2 n2+2n+2(n为正整数)是一组勾股数。
(3) m 2 − n 2 m^{2}-n^{2} m2n2、2mn、 m 2 + n 2 m^{2}+n^{2} m2+n2(m、n表示两个不同的正整数且m>n)是一组勾股数。
(4)如果a、b、c是一组勾股数那么na、nb、nc(n为正整数)也是一组勾股数。

快速幂求逆元

按照费马定理,假设mod和a互质,qmi(a,mod,mod-2)求出来的即为a在mod下的逆元,这样的话我们只需要一个快速幂和模就可以求出逆元了。

我们在这里再简单的介绍一下裴蜀定理

裴蜀定理:对于任意正整数a,b,一定存在非零整数x,y,使得ax+by=k*gcd(a,b),(k!=0)

扩展欧几里得算法

扩展欧几里得算法证明

gcd(a,b)=gcd(b,a%b),其实也是gcd(a%b,b)但是在具体的代码实现中。我们保证第二个数是小数,这样到了最后答案直接是第一个, 操做起来比较方便。下面证明exgcd:
ax + by = gcd(a,b),可以同理得到by+(a%b)x=gcd(a,b),这样依次循环下去,化简:by+(a - a/b * b) * x = gcd(a,b),即ax + b *(y - a/b * x)=gcd(a,b)。
假设开始的时候是aX0+bY0=gcd(a,b)
然后递归迭代一次是bX1+(a%b)Y1=gcd(b,a%b)
然而gcd(b,a%b)=gcd(a,b)

a * X0+b * Y0=b * X1+(a%b) * Y1
a * X0+b * Y0=b * X1+(a - a / b * b ) * Y1
a * X0+b * Y0=b * X1+a * Y1-a / b * b * Y1
a * X0+b * Y0=a * Y1 + b * (X1 - a / b * b * Y1)
分析可得:X0=Y1,Y0=X1 - a / b * b * Y1
我们分析公式可得,每一次迭代,X和Y都是交叉相联系的,所以如果我们在进行下一步递归时,在递归式里将X,Y进行交换这样就可以简化操作原来等式就变成:X0=X1,Y0=Y1 - (a / b * b * X1),这样在进行操作的时候就可以直接在当前的递归层数不对X进行操作,仅仅对进行操作即可。
下面时模板代码:

int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);//这里x,y交换位置方便操作
    y -= a / b * x;
    return d;
}

当然,我们在得到一组特解之后就可以得到所有的解:
由题可得:
aX0+bY0=gcd(a , b),我们假设X’,Y’为通解
aX’+bY’ = gcd(a , b)
X’=X0 + b/gcd(a , b) * k
Y’=Y0 - a/gcd(a , b) * k

X’最小的非负整数解:
(X0 % (b / gcd(a,b) ) + b / gcd(a , b) ) % (b / gcd(a,b) )
下面可以简单证明一下:就是X0 % (b / gcd(a ,b)) = X0 - X0 / (b / gcd(a , b) ) * (b / gcd(a,b) ) ,这是在与x同号的情况下离0最近的答案,如果再加上b / (gcd(a, b) )一定是大于0的且是最小的。

扩展欧几里得的应用

1:求线性同余方程
ax=c(%p) 这里可以改写为ax + py = c 其中的几个值,也就可以求出想要的值
2:求逆元
3:同上解不定方程

中国剩余定理

m 1 , m 2 , m 3 , … … , m k m_{1},m_{2},m_{3},……,m_{k} m1,m2,m3,,mk两两互质,则同余方程组:
在这里插入图片描述
我们令M= m 1 ∗ m 2 ∗ m 3 ∗ … … m k m_{1}*m_{2}*m_{3}*……m_{k} m1m2m3mk
我们令 M i = M / m i M_{i}=M/m_{i} Mi=M/mi M i − 1 M_{i}^{-1} Mi1表示 M i M_{i} Mi的mod m i m_{i} mi的逆元
x = a 1 ∗ M 1 ∗ M 1 − 1 + a 2 ∗ M 2 ∗ M 2 − 1 + a 3 ∗ M 3 ∗ M 3 − 1 ∗ … … ∗ a k ∗ M k ∗ M k − 1 x=a_{1}*M_{1}*M_{1} ^ {-1}+a_{2}*M_{2}*M_{2} ^ {-1}+a_{3}*M_{3}*M_{3} ^ {-1}*……*a_{k}*M_{k}*M_{k}^{-1} x=a1M1M11+a2M2M21+a3M3M31akMkMk1
我们可以证明一下这个解的正确性:
x%m1的时候除了第一项不含 m 1 m_{1} m1其余项中均含 m 1 m_{1} m1所以,其余项模 m 1 m_{1} m1后均为0,而此项 x = a 1 ∗ M 1 ∗ M 1 − 1 x=a_{1}*M_{1}*M_{1} ^ {-1} x=a1M1M11 M 1 M_{1} M1 M 1 − 1 M_{1}^{-1} M11在模 m 1 m_{1} m1下互为逆元,所以为1,所以 x x x a 1 a_{1} a1在mod m 1 m_{1} m1下相同,其余项证明同理。
这个详细的不再证明,另外好像还有中国剩余定理的扩展,这里不再介绍,放上一道例题:戳一戳

高斯消元

高斯消元简介

简介:简单来说,高斯消元就是线代中的求解线性方程组过程,其时间复杂度大概在O(n^3)左右
在这里插入图片描述
以上是原始的方程组,我们通常写成增广矩阵形式
( a 11 a 12 … a 1 n a 21 a 22 … a 2 n … … … … a n 1 a n 2 … a n n ) (2) \left( \begin{matrix} a_{11} & a_{12} & … & a_{1n}\\ a_{21} & a_{22} & … & a_{2n} \\ … &… & … & …\\ a_{n1}&a_{n2}&… & a_{nn} \end{matrix} \right) \tag{2} a11a21an1a12a22an2a1na2nann(2)
前置知识:初等行(列)变换
1:对某一行乘以一个非零的数
2:交换某两行
3:把某行的若干倍加到令一行上去
通过以上的变换,将增广矩阵转换成一个阶梯矩阵:
( a b ⋯ a 0 b ⋯ b ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ c ) (5) \left( \begin{matrix} a & b & \cdots & a\\ 0 & b & \cdots & b\\ \vdots & \vdots & \ddots & \vdots\\ 0 & 0 & \cdots & c \end{matrix} \right) \tag{5} a00bb0abc(5)
类似于以上的一个上三角矩阵,然后从下往上推就可以求出解

解的情况

方程的解有三种情况:
无解
有一个解
有无穷个解

算法的步骤

以下是算法的步骤:
1:枚举方程的每一列
2:找出这一列的绝对值的最大值的那一行放到最上面(并不是整体的第一行而是未确定的第一行)
3:将该行的第一个非零元素转化成1
4:用初等行变换将该行一下所有的该列数变换成0(逐步形成上三角的过程)

算法的实现

对应例题:戳一戳
下面是相应代码:

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const double eps=1e-8;//double类型,所以可能很难有绝对的0和相等,我们就是设值一个值,小于某个值就假设这两个数相等或这个数是0
int n;
double a[N][N];
int gauss()
{
    int c,r;
    for(c=0,r=0;c<n;c++)
    {
        int t=r;//r指当前的行,c指当前的列

        for(int i=r;i<n;i++)//找该列绝对值最大的元素的所在的行
            if(fabs(a[i][c])>fabs(a[t][c]))
              t=i;

        if(fabs(a[t][c])<eps) continue;//如果这一行最大值是0了,那么所有的值都是0,不必在转换
        for(int i=c;i<=n;i++)//交换两行元素
            swap(a[t][i],a[r][i]);

        for(int i=n;i>=c;i--) a[r][i]/=a[r][c];//将当前行的首元素转化为1,尽量倒着往前,不然还得需要记录一下第一个值
        for(int i=r+1;i<=n;i++)
            if(fabs(a[i][c])>eps)
               for(int j=n;j>=c;j--)//将该行下面的所有行的第一个元素变为0
                a[i][j]-=a[r][j]*a[i][c];
        r++;//r只有不被continue时才会到下一行,因为我们每一行都要将第一个非0的数转化为1才行
    }
    if(r<n)//也就是r后面的数应该都是0才对
    {
        for(int i=r;i<=n;i++)
        {
            if(fabs(a[i][n])>eps)//假设r下面的行非0,实际上是无解的,因为我们按照此规则得到的矩阵式r行即下面的矩阵全部是0的,可以自己举个例子看一看
                return 2;
        }
        return 1;
    }
    for(int i=n-1;i>=0;i--)
        for(int j=i+1;j<n;j++)
         a[i][n]-=a[j][n]*a[i][j];//很妙,因为我们是从下往上的,所以当我们枚举到当前值的时候,后面的值都能够得到了,所以我们通过在每一行将去要求的值那一列后面所有的求出来的值,就只剩下了答案
    return 0;
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<=n;j++)
        scanf("%lf",&a[i][j]);
    int t=gauss();
    if(t==0)
    {
        for (int i = 0; i < n; i ++ )
        {
            if (fabs(a[i][n]) < eps) a[i][n] = 0;  // 去掉输出 -0.00 的情况
            printf("%.2lf\n", a[i][n]);
        }
    }
    else if(t==1) printf("Infinite group solutions\n");
    else printf("No solution\n");
    return 0;
}

组合数学(组合数求法)

杨辉三角求组合数

时间复杂度O(n ^ 2)
对应例题:戳一戳
对应模板:

void init()
{
    for (int i = 0; i < N; i ++ )
        for (int j = 0; j <= i; j ++ )
            if (!j) c[i][j] = 1;
            else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}

通过公式来求

时间复杂度:O(nlogn)
公式: C n m = n ! m ! ( n − m ) ! C_{n} ^ {m}=\frac{n!}{m!(n-m)!} Cnm=m!(nm)!n!
模板:
infact[x]表示x的阶乘的逆元
fact[x]表示x的阶乘

  int a,b;
  cin>>a>>b;
  fact[0] = infact[0] = 1;
    for (int i = 1; i < N; i ++ )
    {
        fact[i] = (LL)fact[i - 1] * i % mod;
        infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
    }
    printf("%d\n", (LL)fact[a] * infact[b] % mod * infact[a - b] % mod);

卢卡斯定理

使用范围:1<=n<=m<=1e18(大致,应该还可以更大点)
C n m = C n % p m % p ∗ C n / p m / p ( % p ) C_{n} ^ {m}=C_{n\%p} ^ {m\%p}*C_{n/p} ^ {m/p}(\%p) Cnm=Cn%pm%pCn/pm/p(%p)
对应例题:戳一戳
模板:

int qmi(int a, int k, int p)
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}


int C(int a, int b, int p)
{
    if (b > a) return 0;

    int res = 1;
    for (int i = 1, j = a; i <= b; i ++, j -- )
    {
        res = (LL)res * j % p;
        res = (LL)res * qmi(i, p - 2, p) % p;
    }
    return res;
}


int lucas(LL a, LL b, int p)
{
    if (a < p && b < p) return C(a, b, p);
    return (LL)C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}

总共有三部分:求组合数,快速幂,卢卡斯的递归

通过质因数分解来求

时间复杂度:O(n^2)
对应例题:戳一戳
公式: C n m = n ! m ! ( n − m ) ! = p 1 a 1 ∗ p 2 a 2 ∗ … ∗ p n a n C_{n} ^ {m}=\frac{n!}{m!(n-m)!}=p1^{a1}*p2^{a2}*…*pn^{an} Cnm=m!(nm)!n!=p1a1p2a2pnan
我们可以求出n!可以分解的质因数,m!分解的质因数,(n-m)!的所有质因数,所以我们将所有的因数找出来后就直接乘法计算就可以了,上述原题会用到高精度,至于那个n!分解后的的某个质因数的个数,上面已经讲过了,这里直接看代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 5010;
int primes[N], cnt;
int sum[N];
bool st[N];
void get_primes(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}
int get(int n, int p)
{
    int res = 0;
    while (n)
    {
        res += n / p;
        n /= p;
    }
    return res;
}


vector<int> mul(vector<int> a, int b)
{
    vector<int> c;
    int t = 0;
    for (int i = 0; i < a.size(); i ++ )
    {
        t += a[i] * b;
        c.push_back(t % 10);
        t /= 10;
    }
    while (t)
    {
        c.push_back(t % 10);
        t /= 10;
    }
    return c;
}
int main()
{
    int a, b;
    cin >> a >> b;

    get_primes(a);

    for (int i = 0; i < cnt; i ++ )
    {
        int p = primes[i];
        sum[i] = get(a, p) - get(a - b, p) - get(b, p);//这里是那个公式,我们要记得减去(a-b)!和那个b!中的因子数
    }
    vector<int> res;
    res.push_back(1);

    for (int i = 0; i < cnt; i ++ )
        for (int j = 0; j < sum[i]; j ++ )
            res = mul(res, primes[i]);//这里用到了高精度
    for (int i = res.size() - 1; i >= 0; i -- ) printf("%d", res[i]);
    puts("");
    return 0;
}

卡特兰数

先找一个例题来求卡特兰数:

在这里插入图片描述
提交:戳一戳
首先任意前缀序列中的0的个数都不少于1的个数,我们可以将其放到二维平面中去左,0表示左移,1表示上移,这样的就是可以得出下面的图,根据线性规划
在这里插入图片描述
我们发现,只要是在蓝线的下面走就可以保证0的个数一定是大于等于1的个数
在这里插入图片描述
但是只要是经过了那个绿色的线,就无法满足情况了。
假设我们走到了(4,4)这个格子,那么所有的情况就是 C 8 4 C_{8}^{4} C84
在这里插入图片描述
我们又发现,每一个经过黄线到达蓝线的红线最终到达(4,4)这个点都有一条线与黄线对称到达(3,5)这条线,这样答案就出来了: C 8 4 − C 8 3 C_{8}^{4}-C_{8}^{3} C84C83,这样我们可以发现,到达任意一点的方案数就是 C 2 n n − C 2 n n − 1 C_{2n}^{n}-C_{2n}^{n-1} C2nnC2nn1中情况,我们化简一下就是 C 2 n n / ( n + 1 ) C_{2n}^{n}/(n+1) C2nn/(n+1)这就是卡特兰数,很多例子都是卡特兰数,有兴趣的可以到网上搜一下
这样的话题目就很简单了:
下面是参考代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 200010, mod = 1e9 + 7;

int n;
int fact[N], infact[N];

int ksm(int a, int k) {
    int res = 1;
    while (k) {
        if (k & 1) res = (LL)res * a % mod;
        a = (LL)a * a % mod;
        k >>= 1;
    }
    return res;
}

void init() {
    fact[0] = infact[0] = 1;
    for (int i = 1; i < N; i++) {
        fact[i] = (LL)fact[i - 1] * i % mod;
        infact[i] = (LL)infact[i - 1] * ksm(i, mod - 2) % mod;
    }
}

int main() {
    init();
    cin >> n;
    int res = (LL)fact[2 * n] * infact[n] % mod * infact[n] % mod * ksm(n + 1, mod - 2) % mod;
    cout << res << endl;
    return 0;
}

持续更新中~~~~~~~~

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

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

相关文章

消息队列 - RabbitMQ

1. 名词解释 Producer&#xff1a;生产者 Broker&#xff1a;接收和分发消息的应用 Connection&#xff1a;生产者和消费者与 Broker 之间的 TCP 连接 Channel&#xff1a;信道&#xff1b;在 Connection 内部建立的逻辑连接&#xff0c;每个 Channel 之间是相互隔离的。相…

第十四届模拟赛第二期试题【Java解析】

目录 ✏️写在前面 ✨历史回顾 &#x1f388;第一题&#xff08;二进制API&#xff09; 代码&#xff1a; 思路&#xff1a; &#x1f388;第二题&#xff08;闰年问题/时间API&#xff09; 代码1&#xff1a; 思路1&#xff1a; 代码2&#xff1a; 思路2&#xff1a…

【计算机网络】数据链路层:使用点对点信道的数据链路层

数据链路层信道类型&#xff1a; &#xff08;1&#xff09;点对点信道&#xff1a;使用一对一的点对点通信方式 &#xff08;2&#xff09;广播信道&#xff1a;使用一对多的广播通信方式。 必须使用专用的共享信道协议来协调主机数据发送。 链路:从一个节点到相邻节点的一…

TCP的三次握手和四次挥手

目录:smile_cat:基础知识回顾1、运输层概述2、端口号3、复用与分用:smiley_cat:重点知识来袭1、TCP和UDP2、三次握手3、四次挥手4、TCP报文段首部格式文章参考来源&#xff1a; TCP的三次握手和挥手–飞天小牛肉20-1-tcp连接——初始化序列号(ISN)_网络安全-CSDN博客_初始序列…

掌握分布式环境缓存更新策略,提高缓存与数据库数据一致性

概述 随着时代的发展&#xff0c;服务系统架构也已经由最初的单体架构转变为分布式、微服务架构模式。 从数据体量上来看&#xff0c;各系统存储的数据量越来越大&#xff0c;数据的查询性能越来越低。 此时&#xff0c;就需要我们不断的进行优化&#xff0c;最常用的就是引入…

NVIDIA RTX3090上安装tensorflow-gpu 1.12.0

目录 项目场景&#xff1a; 问题描述1 CUDA版本不匹配&#xff0c;需要重新安装 解决方案1&#xff1a; 额外安装其他版本的CUDA&#xff0c;并实现版本自由切换。 问题描述2&#xff1a; 1. cuDNN包解压后的cudnn.h文件无法复制到目标文件夹中 2. 如何查看是否会到最初…

计算机系统基础期末复习

C语言代码如下&#xff1a; void fun(int n){ int x n*12;int y n/32; }请将其中计算的部分优化为位运算、移位运算和加法运算的结合。 x n8n4 (n<<3)(n<<2) x (n(n>>31) & 0x1F)>>5 设32位的位串为x(x类型为unsigned int)&#xff0c;现要…

python dingding --- 钉钉机器人API

dingding — 钉钉机器人 github 源码地址&#xff1a;https://github.com/zly717216/dingding 一、模块介绍 版本号 dingding: V1.0.0 功能 当前版本支持群机器人相关API调用&#xff0c;包括发送文本消息、文本链接、markdown、整体跳转 ActionCard、独立跳转 ActionCar…

【MindSpore】DCGAN生成漫画头像-----利用华为云modelarts云终端实现

前言 本人对于 mindspore 一点也不熟悉 但是 对于 学习新事物的心情和动力 一直都很澎湃 本次参加 mindSpore 的 DCGAN生成漫画头像 社区活动&#xff0c;希望能够增长见识 关注 证明图 使用工具 我直接使用的 mindSpore 提供的在线云环境 的终端来 体验 这一次的任务训练 …

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置

【Autopsy数字取证篇】Autopsy数字取证软件的下载安装与优化配置 Autopsy是一款免费开源的优秀数字取证&#xff08;Digital Forensics&#xff09;软件&#xff0c;提供与其他数字取证工具相同的核心功能&#xff0c;并提供其他商业工具不提供的其他基本功能&#xff0c;例如…

video元素与audio元素详解

1.video/audio属性 video元素和audio元素是HTML5中针对视频新增的两个标签&#xff0c;通过对这两个标签进行设置&#xff0c;可以控制页面的 上的音视频的播放。 1.src 属性 设置音/视频文件的URL地址。相关使用代码如下: <video src"movie.mp4"></vide…

【面试】揭秘面试背后的那点真实

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录前言/背景面试流程资料总结/刷题指南个人经验总结寄语&#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢&#xff1a;木芯工作室 、Ivan from Russia 金…

【Windows编程】windows窗口创建过程详解

文章目录前言1 应用程序的分类2 应用程序分类的对比3 编译工具4 windows库文件和头文件5 WinMain函数和MessageBox函数初始6 窗口类7 窗口类的分类8 注册窗口类函数9 注册窗口类的结构体10 注册全局和局部窗口类11 创建窗口的函数12 创建一个windows的过程步骤13 创建一个子窗口…

C语言文件操作——打开 关闭 顺序读写 随机读写

1.文件的打开和关闭 1.1 文件指针 在打开一个文件的时候&#xff0c;会创建一个文件信息区&#xff0c;而文件指针指向的内容就是文件信息区。 文件信息区中存储的到底是什么内容的&#xff0c;我们可以在VS2013中查看一下文件信息区的内容(不同编译器下有所差异)。 struct …

shell脚本的条件判断2:文件属性的判断与比较

一 文件属性的判断与比较 Shell支持大量对文件属性的判断&#xff0c;常用的文件属性操作符很多&#xff0c;如下表所示。更多文件属性操作符可以参考命令帮助手册&#xff08;man test&#xff09;。 二 实例 实例&#xff1a;文件和目录判断 可以创建新的文件&#xff0c;…

属性值最大长度为30个字符(15个汉字)

上图是一位做成人用品店主反馈的问题&#xff0c;查看发过来的错误列表后&#xff0c;发现这份错误列表主要是有两个问题&#xff1a;一、属性值最大长度为30个字符(15个汉字)&#xff1b;二、手机端宝贝描述中每张图片的宽要在480到1500之间&#xff0c;最大高度为2500, 以下图…

深度学习之路=====11=====>>ShuffleNet(tensorflow2)

简介 来源&#xff1a;CVPR2017 作者&#xff1a;张祥雨&#xff0c;西安交通大学本硕博&#xff0c;原微软亚洲研究院研究员 特点 逐点分组卷积&#xff08;pointwise group conv)&#xff1a;使用了kernel_size1的分组卷积&#xff0c;大大降低模型参数量和计算量深度卷积…

阅读书《电子电路原理》截取的一些最核心的思想,找了个课程上海交通大学 郑益慧主讲做辅助(保证基本的理解是对的)。电路要以基本特性为基础从设计角度理解

一、戴维南 和 诺顿 物理量 过程戴维南等效诺顿等效步骤 l将负载电阻开路将负载电阻短路步骤 2计算或测量开路电 压&#xff0c; 即戴维南电压计算或测量短路电流&#xff0c;即诺顿电流步骤 3将电压源短路&#xff0c;电流源开路将电压源短路&#xff0c;电流源开路&#xff…

学生网页课程设计期末作业 HTML+CSS+JavaScript甜品蛋糕网页设计(5页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

如何使用 Nginx 部署 React App 到 linux server

油鹳视频&#xff1a;How To Deploy A React App - Using NGINX & Linux https://www.youtube.com/watch?vKFwFDZpEzXY&t547s 1. 获得一个 linux server 方法很多种&#xff0c;例如 aws EC2 , 阿里云 ECS &#xff0c; linode 等 2. 登录远程服务器并设置服务器 命…