倍数
约数
核心代码
本质是跟据倍数进行约数。
素数
判断素数核心代码
不需要够多判断。由于约数。会造成重复
优化代码朴素筛法
以判断出来的素数为底。是素数倍数的比不是素数
艾诗筛法改进
进一步判断是素数才更新。
欧几里得算法
张转相除法
用这个可以解不定方程。强
同与方程
#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次方