乘法取模优化

inline long long multi(long long x,long long y,long long mod)//mod long long
{
    long long tmp=(x*y-(long long)((long double)x/mod*y+0.5)*mod);
    return tmp<0 ? tmp+mod : tmp;
}
int pdt(int x,int y,int mods) { //汇编优化,易出锅,能不用尽量不用,不知道什么情况下会跑崩,一般没事
    int ret;
    __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n":"=d"(ret):"a"(x),"b"(y),"c"(mods));
    return ret;
}

原文地址:https://www.cnblogs.com/bibibi/p/9613151.html

时间: 2024-10-15 03:16:30

乘法取模优化的相关文章

HDU6128 二次剩余/二次域求二次剩余解/LL快速乘法取模

LINK 题意:求满足模p下$\frac{1}{a_i+a_j}\equiv\frac{1}{a_i}+\frac{1}{a_j}$的对数,其中$n,p(1\leq n\leq10^5,2\leq p\leq10^{18})$ 思路:推式子,两边同乘$(a_i + a_j)^3$,得$a_i^2+a_j^2 \equiv {a_i·a_j} \mod{p}$,进一步$a_i^2+a_j^2+a_i·a_j\equiv {0} \mod{p}$,然后?然后会点初中数竞,或者数感好会因式分解就能看出

证明 poj 1014 取模优化剪枝,部分递归 存在错误

做了这道题目,我才发现一道题即便可行,但是正确性也不一定.多数由于题目数据太弱. poj 1014 Dividing 题目大意:有6堆石头,权重分别为1 2 3 4 5 6,要求输入 每堆个数 ,求是否可以平分石头使得两堆价值相同. 网上对这道题的做法就两种,其中有错误的版本,却也可以AC.起初这让我等菜鸟感慨代码的简洁,但无法得出正确性的证明 接下来就对两种方法的错误性进行证明. 1.多重背包 #include <map> #include<string> #include &l

快速乘法取模算法

原理: 32+16+4=52 1 LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘: O(1)乘法或者转化成二进制加法 2 //快速乘法取模算法 3 4 LL ret = 0; 5 while(y) { 6 if(y & 1) 7 ret = (ret + x) % mod; 8 x = x * 2 % mod; 9 y >>= 1; 10 } 11 return ret; 12 } 原文地址:https://www

ACwing90 64位整数乘法 大数乘法取模

网址:https://www.acwing.com/problem/content/92/ 题解: 大数乘法取模模板. AC代码: #include <bits/stdc++.h> using namespace std; long long add(long long a, long long b, long long p) { long long res = 0; while (b) { if (b & 1) res = (res + a) % p; a = (a * 2) % p

codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数

对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些细节,比如快速幂时ans矩阵的初始化方式,快速幂的次数,矩阵乘法过程中对临时矩阵的清零,最后输出结果时的初始矩阵...矩阵快速幂好理解但是细节还是有点小坑的.. 下面就是满满的槽点,,高能慎入!!! 对于这个题目要求矩阵过程中对m取模,结果对g取模,我表示难以接受,,上来没看清题直接wa19个点,另

大数乘法取模运算(二进制)

问题: 求 (a*b) % m 的值,其中 a,b,m 是1到10^18: 如果直接乘的话,因为a和b还有m都很大,那么会溢出long long,所以需要一些方法: 朴素的想法是用数组模拟高精度,但是比较麻烦: 二进制数也是满足十进制竖式乘法运算规律的,我们可以模拟二进制乘法竖式来计算(a*b)%m,因为其每次只相当于a乘2,再取模就不会溢出了: 代码: #include <bits/stdc++.h>#define MAXN 100000+10#define ll long longusin

乘法取模

当我要计算两个数相乘后取模的结果时,可以这样写: 1 typedef long long LL; 2 3 LL multi(LL a, LL b, LL mo){ 4 LL ans = 0; 5 while(b){ 6 if(b & 1){ 7 ans += a; 8 if(ans >= mo){ 9 ans -= mo; 10 } 11 } 12 a <<= 1; 13 if(a >= mo){ 14 a -= mo; 15 if(a == 0) return ans;

codeforces 584b 超大型指数乘法取模o(logn)

题意是怎么理解的我也不知道,就抄了一下 题目大意:给出n个等边三角形,每个顶点都可以是1~3中的一个数,一个等边三角形三个顶点的总和不能是6.在n个三角形中只要有一个等边三角形满足条件,当前情况就是合格的,问有多少种合格的情况. 解题思路:所有的情况27n,没有一个三角形满足条件7n,案27n−7n. #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #inc

证明 poj 1014 模优化修剪,部分递归 有错误

这个问题是存在做.我发现即使是可行的一个问题,但不一定正确. 大部分数据疲软,因为主题. id=1014">poj 1014 Dividing 题目大意:有6堆石头,权重分别为1 2 3 4 5 6,要求输入 每堆个数 ,求能否够平分石头使得两堆价值同样. 网上对这道题的做法就两种,当中有错误的版本号.却也能够AC. 起初这让我等菜鸟感慨代码的简洁,但无法得出正确性的证明 接下来就对两种方法的错误性进行证明. 1.多重背包 #include <map> #include<