蓝桥杯——数学专题

Posted 中二病没有蛀牙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯——数学专题相关的知识,希望对你有一定的参考价值。

例题:等差数列 辗转相除gcd

思路:求数组的最大公约数

等差数列 https://www.acwing.com/problem/content/1248/

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
#define INF 0x3f3f3f3f
typedef long long ll;
int a[maxn],b[maxn];

int gcd(int m,int n){
    if(n == 0) return m;
    return gcd(n, m % n);
}

int main()
{
    int n,m;
    cin>>n;
    int f = 1;
    for(int i = 1; i <= n; ++i){
        cin>>a[i];
        if(a[i] != a[1])
            f = 0;
    }
    if(f) {
        cout<<n<<endl;
        return 0;
    }
    sort(a+1,a+1+n);
    for(int i = 1; i <= n; ++i)
        b[i - 1] = abs(a[i] - a[i - 1]);
    // cout<<gcd(70,20);
    int ans = b[1];
    for(int i = 1;i < n;i++){
        // cout<<b[i]<<" "<<ans<<" ";
        ans = gcd(b[i],ans);
        // cout<<ans<<endl;
    }
    cout<<abs(a[n] - a[1]) / ans + 1<<endl;
    return 0;
}

例题:X的因子链

例题https://www.acwing.com/problem/content/1297/
知识点:

算数基本定理——因式分解定理

可重复组合(多重集合组合数)

在这里插入图片描述

多重集合排列数

从有n个不同元素的集合任取r个元素的排列方式有:

P ( n , r ) = n ∗ ( n − 1 ) ∗ . . . ∗ ( n − r + 1 ) = n ! ( n − r ) ! P(n, r) = n*(n-1)*...*(n-r+1) = \\frac{n!} { (n-r)!} P(n,r)=n(n1)...(nr+1)=(nr)!n!
特别地 P ( n , n ) = n ! P(n,n) = n! P(n,n)=n!

或者 M = { k 1 ⋅ a 1 , k 2 ⋅ a 2 , ⋯ , k n ⋅ a n } M=\\{k_1⋅a_1,k_2⋅a2,⋯,k_n⋅a_n\\} M={k1a1,k2a2,,knan}
(其中每个 a i a_i ai代表是不同的元素,每个元素 a i a_i ai k i k_i ki个, k i k_i ki可以是有限数,也可以是∞。)

多重集合 M = k 1 ⋅ a 1 , k 2 ⋅ a 2 , ⋯ , k n ⋅ a n M={k_1⋅a_1,k_2⋅a2,⋯,k_n⋅a_n} M=k1a1,k2a2,,knan r r r排列数为 k r kr kr

多重集合 M = { k 1 ⋅ a 1 , k 2 ⋅ a 2 , ⋯ , k n ⋅ a n } M =\\{k_1⋅a_1,k_2⋅a2,⋯,k_n⋅a_n\\} M={k1a1,k2a2,,knan}的全排列数为: ( k 1 + k 2 + ⋯ + k n ) ! k 1 ! k 2 ! ⋯ k n ! \\frac{(k1+k2+⋯+kn)!}{k1!k2!⋯kn!} k1!k2!kn!(k1+k2++kn)!

素数筛 线性筛

线性筛板子:

int pri[N+9>>1],now;
bool vis[N+9];
void init(){
    for(int i=2;i<=N;i++){
        if(!vis[i])pri[++now]=i;
        for(int j=1;j<=now&&pri[j]*i<=N;j++){
            vis[pri[j]*i]=1;
            if(i%pri[j]==0)break;
        }
    }
}

代码(分解质因数版):

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1500005;
#define INF 0x3f3f3f3f
typedef long long ll;
int vis[maxn];
ll answer = 1;

ll cal(int x){
    ll res = 1;
    for(int i = 1;i <= x ;i++)
        res *= (1ll*i);
    return res;
}

int main()
{
    int x;
    while(cin>>x){
        int sum = 0,tot = 0 ;
        // ans.clear();
        // memset(vis,0,sizeof(vis));
        for(int i = 2;i * i <= x; i++){
            vis[++sum] = 0;
            while (x  % i == 0)
            {
                x /= i;
                vis[sum]++;
                tot++;
            }      
        }
        if(x != 1){
            vis[++sum] = 0;
            vis[sum]++;
            tot++;
        }
        answer = cal(tot);
        // cout<<sum<<" "<<answer<<endl;
        for(int i = 1;i <= sum ; ++i){
            for(int j = 1;j <= vis[i] ;++j)
                answer /= j;
        }
        cout<<tot <<" "<< answer<<endl;
    }
    return 0;
}

例题:聪明的燕姿

N = p 1 a 1 ∗ p 2 a 2 ∗ ⋅ ⋅ ⋅ ∗ p n a n N=p_1^{a_1} * {p_2}^{a_2}*···*p_n^{a_n} N=p1a1p2a2pnan(其中一系列 a n a_n an为指数, p n p_n pn为质数)

约数个数

约数个数 ( a 1 + 1 ) ( a 2 + 1 ) … … ( a n + 1 ) (a_1+1)(a_2+1)……(a_n +1) a1+1a2+1an+1

约数之和

约数之和 ( 1 + p 1 1 ∗ + p 1 2 + ⋅ ⋅ ⋅ + p 1 a 1 ) ∗ ⋅ ⋅ ⋅ ∗ ( 1 + p

以上是关于蓝桥杯——数学专题的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯——动态规划专题

蓝桥杯之数论专题

AcWing刷题蓝桥杯专题突破-广度优先搜索-bfs(11)

洛谷刷题蓝桥杯专题突破-广度优先搜索-bfs(16)

蓝桥杯冲刺并查集专题

蓝桥杯选拔赛真题32Scratch123数学黑洞 少儿编程scratch蓝桥杯选拔赛真题讲解