码迷,mamicode.com
首页 > 其他好文 > 详细

数论基础

时间:2015-08-06 13:15:03      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:

1、欧几里德算法

int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b , a%b);
}

int lcm(int a, int b)
{
    return a/gcd(a,b)*b;//防止溢出

}

2、Eratosthenes筛法

int m = sqrt(int n+0.5);
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= m; i++)
{
    if(!vis[i])
    for(int j = i*i; j <= n; j += i)
    {
        vis[j] = 1;
    }
}

3、扩展欧几里德算法

4、同余与模算术

1)同余定理

//(a+b)%n=(a%n+b%n)%n

//(a-b)%n=(a%n-b%n+n)%n

//a*b%=(a%n)*(b%n)%n;

int mul_mod(int a, int b, int n)
{
    a %= n;
    b %= n;
    return (int)((long long)a * b % n);
}

2)大数取模

scanf("%s%d",n, &m);
int len = strlen(n);
int ans = 0;
for(int i = 0; i < len; i++)
{
    ans=(int)((long long)ans*10 + n[i] - ‘0‘) % m);
}
printf("%d\n",ans);

3)幂取模

int pow_mod(long long a,long long n,int m)
{
    if(n==0) return 1;
    long long int x=pow_mod(a,n/2,m);
    long long int ans=x*x%m;
    ans=ans%m;
    if(n%2==1) ans=ans*a%m;
    return (int)ans;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

数论基础

标签:

原文地址:http://blog.csdn.net/xinag578/article/details/45974511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!