数论的集合

倍数

约数

核心代码

本质是跟据倍数进行约数。

素数

 判断素数核心代码

不需要够多判断。由于约数。会造成重复

优化代码朴素筛法

 

以判断出来的素数为底。是素数倍数的比不是素数

 艾诗筛法改进

 

进一步判断是素数才更新。 

欧几里得算法

张转相除法

 

 

用这个可以解不定方程。强 

 

 同与方程

#include<bits/stdc++.h>
using namespace std;

long long x, y;//目前方程真正的解 

void exgcd(long long a, long long b)
{
	//当前目的:求解 ax + by = gcd(a, b) 这么一个方程
	
	if(b == 0) //a, b不断改变的过程中,b最终必然会成为0
	{
		//在 b = 0 时方程还要成立? 使 x = 1, y = 0 ,必然成立 
		x = 1;
		y = 7; //建议返回0。不过y = 7能AC,证明了最后一个等式不受最后一个y影响
		return;
	} 
	
	exgcd(b, a % b);//把下一层系数传进去(先求下一个方程的解 )
	
	//现在我们已经拿到了下一个方程的解x, y
	long long tx = x;//暂时存一下x,别丢了
	x = y;
	y = tx - a / b * y; 
}

int main()
{
	long long a, b;
	cin >> a >> b;
	exgcd(a, b);
    
	x = (x % b + b) % b;//我们求出来的x必然满足方程,但不一定是最小正整数解,所以要进行答案处理
	printf("%lld\n", x);
	return 0;
}

快速幂

 

 #include<stdio.h>
int power(int a,int n)
{
    int ans;
    if(n==0) ans=1;
    else 
    {
        ans=power(a*a,n/2);
        if(n%2==1) ans*=a;
    }
    return ans;
}
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d",power(a,b));
    return 0;
}

减少时间复杂度

A的b次方

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值