数学相关

文章目录

  • 1 素数筛
  • 2 快速幂

1 素数筛

在找质数的时候多数情况下都要用到素数筛,接下来简单介绍3种
1.二层循环判断法
本方法算不上是筛,因为本方法是判断所给数是否为素数。本方法运用比较灵活,如打表等。
代码:

bool judgesushu(int x)
{
    if(x>2 && x%2==0)
        return 0;
    for(int i=3;i<=sqrt(x);i+=2)
    {
        if(x%i==0)
            return 0;
    }
    return  1;
}

2.埃拉托斯特尼筛法(复杂度为nlogn)
一般情况下这种方法就可以力!
此方法就是找到每一个质数,然后此质数的倍数就都被筛掉了。
代码:

#define SIZE 1000000
int main()
{
    int check[SIZE] = {0};//元素值为0代表是素数
    int prime[SIZE] = {0};//里面存了所有的质数
    int pos=0;
    int flag;
    for (int i = 2 ; i < SIZE ; i++)
    {
        if (!check[i])//如果是素数
            prime[pos++] = i;

        for (int j = 2*i ; j < SIZE ; j += i)
        {
            check[j] = 1;
        }
    }
   
    return 0;
}

3.线性筛素数(复杂度为n)

#define SIZE 1000000
int main()
{
    int check[SIZE] = {0};//元素值为0代表是素数
    int prime[SIZE] = {0};
    int pos=0;
    int flag;
    for (int i = 2 ; i < SIZE ; i++)
    {
        if (!check[i])//如果是素数
            prime[pos++] = i;

        for (int j = 0 ; j < pos && i*prime[j] < SIZE ; j++)
        {
            check[i*prime[j]] = 1;//筛掉
            //标注一
            if (i % prime[j] == 0)
                break;
        }
    }
    return 0;
}

线性筛的显著特点就是所有数只筛一遍。

详细内容见博客:
博客一

博客二

2 快速幂

转载于博主刘扬俊
快速幂
快速幂最终优化代码:

int m//m为需要模的数
long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) {//此处等价于if(power%2==1)
            result = result * base % m;
        }
        power >>= 1;//此处等价于power=power/2
        base = (base * base) % m;
    }
    return result;
}

快速幂经典例题:转圈游戏
AC代码:

#include
#include
#include
#include
using namespace std;
void swap(long long a,long long b)
{
    long long c=a;
    a=b;
    b=c;
}
long long gcd(long long a,long long b)
{
    if(a>b)
        swap(a,b);//a
    while(b%a)
    {
        long long c = b%a;
        b=a;
        a=c;
    }
    return a;
}
int  main()
{
    long long n,m,k,x;
    cin>>n>>m>>k>>x;
    long long q=n*m/gcd(n,m)/m;//需要跳多少次回原位
    long long w=1;
    long long s=10;
    while(k>0)
    {
        if(k&1)
            w=w*s%q;
        k=k>>1;
        s=s*s%q;
    }
    long long r;
    r=(x+w*m)%n;
    cout<<r<<endl;
    return 0;
}

你可能感兴趣的:(ACM)