zoukankan      html  css  js  c++  java
  • 64位整数乘法

    原题
    求 a 乘 b 对 p 取模的值。

    输入格式

    第一行输入整数a,第二行输入整数b,第三行输入整数p。

    输出格式

    输出一个整数,表示a*b mod p的值。

    数据范围

    (1≤a,b,p≤10^{18})

    输入样例:

    3
    4
    5
    

    输出样例:

    2
    
    • 这题可以用大数相乘,但是没必要那么麻烦,可以用这个位运算的思想把b个a相加起来
    #include<iostream>
    using namespace std;
    
    int main(void)
    {
        long long a,b,p,res=0;
        cin>>a>>b>>p;
        while(b)
        {
            if(b & 1)
                res=(res + a) % p;
            a=a*2%p;
            b >>= 1;
        }
        cout<<res<<endl;
        return 0;
    }
    
    • 另外一种方法:(a imes b mod p = a imes b - lfloor a imes b div p floor imes p)
      • (a , b < p)时,(a imes b div p)下取整之后也一定小于p.浮点类型long double在十进制下有效数字有(18 sim 19)位,足够胜任.当浮点数的精度不足以保存精确数值时,会像科学记数法一样舍弃低位.
      • (a imes b)(lfloor a imes b div p floor imes p) 可能很大,但是二者的差一定在(0 sim p-1)之间。
    #include<iostream>
    using namespace std;
    
    int main()
    {
        long long a,b,p,res = 0;
        
        cin>> a >> b >> p;
        a %= p,b %= p;
        long long c = (long double) a * b / p;
        long long ans = a * b - c * p;
        if(ans < 0)
            ans += p;
        else if(ans >= p)
            ans -= p;
        cout<< ans <<endl;
        return 0;
    }
    
  • 相关阅读:
    指针常量 和 常量指针
    串口通讯
    C语言的抽象与函数指针2
    STM32 中常见错误 的处理方法
    串行通信之狂扯篇
    VMware中虚拟机网卡的四种模式
    VSFTP配置虚拟用户
    MySQL数据库备份命令
    rsync Linux系统下的数据镜像备份工具
    linux常用命令
  • 原文地址:https://www.cnblogs.com/qscgy/p/13417336.html
Copyright © 2011-2022 走看看