同余与模运算

发现自己还是看书少了,能从书上学到不少东西。

加减乘的模运算:

#include<cstdio>
using namespace std;
int mul_mod(int a,int b,int n){
    a %= n; b %= b;
    return (int)((long long)a * b % n);
}///如果n本身超int,就要用高精度了
int add_mod(int a,int b,int n){
    a %= n; b %= b;
    return (int)((a + b) % n);
}
int subtract_mod(int a,int b,int n){
    a %= n; b %= b;
    return (int)((a - b + n) % n);
}
int main()
{
    return 0;
}

大整数取模:也就是从头到尾,每当数达到大于等于n就对n取模,相当于把大整数转换成1234 = ((1*10+2)*10+3)*10+4的形式

输入大整数,和n

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    int m;
    char n[100];
    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);
    }
    return 0;
}

幂取模:输入a,n,m输出a^n mod m的值,a,n,m<=10^9

简单的代码,时间复杂度为O(n)

int pow_mod(int a,int n,int m)
{
    int ans=1;
    for(int i=0;i<n;i++) ans=(int)((long long)ans*n%m);
}

下面可以利用分治法,减少时间复杂度。时间复杂度减少为O(logn)

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

a^29=(a^14)^2*a, a^14=(a^7), a^3=a^2*a a=1*1*a;

模拟线性方程组:输入a,b,c解方程      ax(三道杠)b(mod n)       ,a,b,n<=10^9

a和b关于模n同余,充要条件a-b是n的整数倍。

方程ax(三道杠)1(mod n)的解称为a关于模n的逆,当gcd(a,n)=1时,该方程组有唯一解,否则无解。

下面程序表示a(三道杠)1(mod n) 的解,要求gcd(a,n)=1

#include<cstdio>
using namespace std;

int main()
{
    int a,n;
    scanf("%d%d",&a,&n);
    int x;
    for(int y=0;;y++)
    {
        if( (1+n*y)%a==0 ){
            printf("x = %d\n",(1+n*y)/a);
            break;
        }
    }

    return 0;
}
时间: 2024-11-05 11:37:58

同余与模运算的相关文章

[转]取模运算和求余运算的区别

[转]取模运算和求余运算的区别 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 通常常用的是正数之间取模或求余.下面的可以先不关心. —————————————————————

【转】数学与编程——求余、取模运算及其性质

声明 转自:https://blog.csdn.net/chensilly8888/article/details/42834697 此博文简短有精悍的讲述了在数学与计算机科学中求余与取模运算的区别, 在不同语言下取模的意义以及取模运算的性质 由于我觉得oi编程的话,只需要弄懂取模的性质就行了,因为编程竞赛的时候,是只用一种语言写的,自己平常打代码也就熟悉了那种语言的语法之类的. 取模运算的性质 如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m). 如果a≡b(mod

Math——取模运算及取余运算

取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b) 取整运算 要明白取模运算和取余运算之间的区别,首先要了解取整运算(Round Operation) 取整运算常用的有三种,向负无穷取整,向正无穷取整,向零取整 以lua语言为例,lua的math数学库提供三个取整函数,floor向负无穷取整,ceil向正无穷取整,modf向零取整 (PS:lua

python负数除法与模运算

1.负数除法: >>> print 45/76>>> print -45/7-7 >>> print 45/-7-7 >>> print -45/-76 对于第一个示例:第一个数里包含了多少个第二数 45包含了多少个7其结果为6 对于第二个示例: 第一个数到第二个数之间的距离是多少 -45到7的距离为52  52/7=7 其结果在加上符号为-7 可以理解为 -((45+7)/7) 2.模运算 取模与求余这两个运算不能混淆,在C/C++

求商求模运算

这两种运算总是感觉有点迷糊,现在 拨开乌云见天日. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. #include <iostream> using namespace std; void div(){ printf("5/3: %d",5/3);cout << endl; printf("5/(-3): %d",5/-3);cout <<

【转】由HashMap哈希算法引出的求余%和与运算&amp;转换问题

目录 1.引出问题 2.结论 3.分析过程 4.总结 回到顶部 1.引出问题 在前面讲解HashMap 的源码实现时,有如下几点: ①.初始容量为 1<<4,也就是24 = 16 ②.负载因子是0.75,当存入HashMap的元素占比超过整个容量的75%时,进行扩容,而且在不超过int类型的范围时,进行2次幂的扩展(指长度扩为原来2倍) 扩大一倍 ③.新添加一个元素时,计算这个元素在HashMap中的位置,也就是本篇文章的主角 哈希运算.分为三步: 第一步:取 hashCode 值: key.

分数的乘法逆元和负数的取模运算

1.乘法逆元 A.定义 如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x. 既然有ax≡1 (mod p),那么有ax - py = 1,x是a关于模p的乘法逆元. B.分数的乘法逆元 对于实数域,一个数的乘法逆元就是其倒数,所谓乘法逆元就是相乘等于单位元的那个数. 对于ecc算法的离散曲线域,m的乘法逆元为n,满足m * n = 1 (mod p),即满足m*n mod p = 1 mod p,称作n就是m关于的p乘法逆元.在离散曲线域中,单位元

a ^ b mod c 取模运算优化反思(老物)

这是一篇嘲讽我之前的自己采用笨重愚蠢思想去解决问题的日志. RSA 加密与解密涉及到 a ^ b mod c 的问题,如何计算这个值呢? 我会选择 pow(a, b) % c, 事实上在写RSA的时候确实是这么干的,但现在看来真心愚蠢, 因为我为此不得不去实现了一个自己的大数四则运算库,也就是以数组为数(BigNum),而对于mod运算只需要换算为 A % B = A - ( A / B ) * B , 好吧,我自认为轮子准备充分了, 很快就写完了,也觉得很满意,也没什么不合适的地方,但现在开始

小手记之与运算代替模运算

等式 先抛出一个等式, X & (2n?1) == X % 2n 右边式子,也就是模运算,最后的结果为[0, 2n?1],而左边的式子,也就是与运算,可以将X的高位清掉,最后剩下的是X的[0, n)位上面的数值,这个值当然也是∈[0, 2n?1],所以左右两边是相等的. 对比 模运算经常用来做哈希,利用上面的等式,我们完全可以使用与运算来代替模运算, 好处,与运算要比模运算来得快: 限制,模数必须是2的次幂: 参考资料 http://ifeve.com/dissecting-disruptor-