Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

    • 01分数规划学习笔记
    • CDQ分治学习笔记
    • wqs二分学习笔记
    • 一两句话小技巧
      • 二进制枚举子集
      • 求余$O(1)$快速乘
    • 单调性应用学习笔记
    • 哈希函数(Hash)函数的设计
    • 带权并查集处理线段
    • 环检测算法学习笔记
    • 约瑟夫环学习笔记
    • 组合情况
    • 高效位运算

一两句话小技巧

# 一两句话小技巧

# 二进制枚举子集

int S = 11; // 1011b
for(int x=S; x>0; x=(x-1) & S) // do something
// 1. x = 1011 2. x = 1010 3. x = 1001
// 4. x = 1000 5. x = 0011 6. x = 0010
// 7. x = 0001 8. x = 0000
1
2
3
4
5

# 求余O(1)O(1)O(1)快速乘

当两个long long相乘会溢出,又不能用__int128_t时使用。

当mod过大时可能出现精度问题。

不使用四舍五入

ll mul_mod(ll a, ll b, ll mod){
    return (a*b-(ll)((long double)a/mod*b)*mod+mod)%mod;
}
1
2
3

使用四舍五入

ll mul_mod(ll a, ll b, ll mod){
    ll c = a*b-(ll)((long double)a/mod*b + 0.5)*mod;
    return c<0?c+mod:c;
}
1
2
3
4

原理:

a∗bmodp=a∗b−⌊a∗bp⌋∗pa*b\mod p = a * b - \lfloor\frac{a*b}{p}\rfloor *pa∗bmodp=a∗b−⌊pa∗b​⌋∗p

令d=⌊a∗bp⌋d = \lfloor\frac{a*b}{p}\rfloord=⌊pa∗b​⌋,最终结果为c=a∗b−d∗pc=a*b-d*pc=a∗b−d∗p,明显a*b与d*p都可能会溢出(即对2632^{63}263取模),但他们的差值一定在long long的范围内(差值的绝对值小于ppp)。

上次更新: 2021/02/24, 03:37:30
wqs二分学习笔记
单调性应用学习笔记

← wqs二分学习笔记 单调性应用学习笔记→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式