蓝桥备战-数学知识

我是开心果,在备战蓝桥的路上,和你一起努力,今天是蓝桥倒计时第10天,预祝大家取得好成绩,并希望自己的努力会产生好的结果。
在这里插入图片描述

一.质数

定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
质数筛:快速的将质数筛出来,每个数都会被他的最小质因子筛掉,故外层循环是从2到n。如果这个数没有被筛掉,说明这个数为质数,找完质数了,就要执行下一步了,筛不是质数的数,循环质数,质数的i倍会被筛掉,不能筛多了吧,要不就死循环了,所以要加一个判断,如果这个数除以质数为0了,就证明这个数用完了。

int prime[100010],cnt;
bool st[100010];
int get_prime(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(!st[i])prime[cnt++]=i;
		for(int j=0;prime[j]<=n/i;j++)
		{
			st[i*prime[j]]=true;
			if(i%prime[j]==0)
				break;
		}
	}
}

二.约数

定义:约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
求约数:

vector<int>get_divisors(int x)
{
	vector<int>res;
	for(int i=1;i<=x/i;i++)
	{
		if(x%i==0)
		{
			res.push_back(i);
			if(i!=x/i)res.push_back(x/i);
		}
		sort(res.begin(),res.end());
		return res;
	}
}

最大公约数:__gcd(欧几里得算法)

int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;//看终点,最后肯定面临b等于0,
	//如果b等于0返回a,如果b不等于0,递归,是不是很简单
}

三.欧拉函数

定义:在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。

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;
        }
        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];
                break;
            }
            euler[t] = euler[i] * (primes[j] - 1);
        }
    }
}

四.快速幂

定义:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
如果某个数最后一位是1(二进制哦),那么这个数为奇数,如果是0,那么这个数为偶数。
思路:当这个数大于0时,看看当前这个数是奇数还是偶数,如果为奇数,那么res=res*a%p。

LL qmi(int a,int b,int p)//a的b次方取余p
{
	LL res=1%p;
	while(b)
	{
		if(b&1)res=res*a%p;
		a=a*(LL)a%p;
		b>>=1;
	}
	return res;
}

五.扩展的欧几里得算法

欧几里得算法的定义:欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

int exgcd(int a,int b,int &x,int &y)//俩个未知数x,y
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);//ay+b(x-a/b*y),a和b隐形的
    y-=a/b*x;
    return d;
}

六.中国剩余定理

定义:孙子定理是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。又称中国余数定理。
跟鸡兔同笼差不多。

七.求组合数​​

计算:
在线性写法中被写作C(n,m)。
组合数的计算公式为
在这里插入图片描述
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cabmod(109+7) 的值。
性质:
在这里插入图片描述

c[a][b],mod=1e9+7,N=2010;
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;
		}
	}
}

八.位运算

1.例题:Beast非常喜欢正整数序列,他提出了一个问题。他认为一个正整数是特殊的,如果这个数被可以写成 n的不同非负数幂次之和. 比如说,当 n=4的时候, 17是特殊的, 因为4的0次方+4的2次方等于17,Beast要求你帮助他找到第k个特殊的数字(这些数按升序排序). 因为答案很大,因此需要对10的9次方加7取模。
思路:题目中说这个数可以写成n的不同非负数幂次之和,所以将k表示成二进制的形式,然后计算该二进制下n的不同幂次和。
例如:3 4 ,将4表示为0100,ans=3的平方=9

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const LL mod=1e9+7;
LL qmk(LL a,LL b)//求a的b次方
{
	LL f=1;
	while(b)
	{
		if(b&1)
		{
			f=f*a%mod;
		}
		a=a*a%mod;
		b>>=1;
	}
	return f;
}
void solve()
{
	LL n,k;
	cin>>n>>k;
	LL res=0,cnt=0;//res答案,cnt表示当前是几次幂
	while(k)
	{
		if(k&1)
		res=(res+qmk(n,cnt))%mod;
		cnt++;
		k/=2;
		
	}
	cout<<res<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

2.lowbit返回倒着数第一个为1的后半部分。

int lowbit(int x)
{
	return x&-x;
}

九.裴属定理

裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
定理:当两个数互质时,不能被凑出来的两个数的最大整数为(p-1)(q-1)-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值