首页 > 其他分享 >2024.10.16 鲜花

2024.10.16 鲜花

时间:2024-10-16 21:46:55浏览次数:7  
标签:lfloor 2024.10 frac 鲜花 16 rfloor 模数 reduction Barrett

PRAGMATISM -RESURRECTION

凭什么没词就不是好歌!!!

取模优化

就不讲怎么减少取模了。

比较广为流传的有两种,Barrett reduction,Montgomery Algorithm。

对于固定常数模数,计算机已经优化的很好了,一般不会有太大效果(确实有,用 Barrett reduction 有时可以卡常)。

对于输入的固定模数(即不会改变),可以用一下算法优化。

Barrett reduction:

一句话总结,比较有用,比较好写

考虑对于 \(a\bmod m\),可以用 \(a-m\lfloor \frac{a}{m}\rfloor\),但是直接计算 \(\lfloor \frac{a}{m}\rfloor\),由于除法的常数,并不会快。

众所周知,不能精确计算的就粗略计算,考虑除以 \(2^k\) 是快的,因为可以用位运算,于是我们考虑将 \(\lfloor \frac{a}{m}\rfloor\) 用除以 \(2^k\) 估算。

具体的,设 \(base=\lfloor \frac{2^k}{m} \rfloor\),于是 \(\lfloor \frac{a}{m}\rfloor\) 可以粗略计算为 \(\lfloor \frac{base*a}{2^k}\rfloor\)。

优点是简洁好写,缺点是有一定错误率,且需要用 __int128

错误率:显然,\(\lfloor \frac{base*a}{2^k}\rfloor \le \lfloor \frac{2^k}{m} \rfloor\) 对于 \(k\) 取 \(64\) 时,\(m\) 在 \(10^9\) 左右的模数,极限值域在 \(10^{18}\) 时,用 __uint128_t 存储 \(base\),在测试了 \(10^{10}\) 组纯随机数据中,\(\lfloor \frac{2^k}{m} \rfloor - \lfloor \frac{base*a}{2^k}\rfloor \le 1\),可以加上判断来减掉误差(虽然会变慢)。

Montgomery Algorithm:

一句话总结,卵用没有。

考虑对于加减法,显然可以用判断来代替取模,对于乘法(\(ab \bmod m\)),我们考虑优化。

这里我们需要 \(m\perp 2\)。

设 \(R=2^k > m,a'=aR \bmod m,b'=bR \bmod m\)。

显然有 \(abR \equiv a'b'R^{-1} \pmod m,a'R^{-1}\equiv aR^2 \pmod m,b'R^{-1}\equiv bR^2 \pmod m\),而 \(R^2 \bmod m\) 是可以预处理的,所以我们只要能够快速求出 \(xR^{-1}\bmod m\) 就可以快速求出 \(a',b'\),进而求出 \(abR,ab\)。

如何求出 \(xR^{-1}\) ,考虑求最小的 \(k\) 满足 \(R | x+km\),在将 \(R\) 除掉即可,\(k\pmod -xm^{-1} \pmod R\),提前处理 \(m^{-1} \bmod R\)即可。

优点是不用 __int128,并且实现精细的话可能更快,缺点是必须精细实现,要封装 \(modint\) 来减少转换,细节较多(反正我调了一下午还不如本地动态模数暴力快,提交比固定模数略慢)。

唯一的作用没准就是做模板题 at_arc148_f

速度测试以后会补,有简单的本地评价: Barrett reduction 未加判断。

固定模数: \(默认=Barrett reduction<Montgomery Algorithm\)

非固定数: \(Barrett reduction<默认<Montgomery Algorithm\)

学校 OJ 上固定模数 Montgomery Algorithm 略慢于默认,Barrett reduction 快于默认。

Barrett reduction,Montgomery Algorithm 都不会受模数是否固定影响。

P


标签:lfloor,2024.10,frac,鲜花,16,rfloor,模数,reduction,Barrett
From: https://www.cnblogs.com/xrlong/p/18470908

相关文章

  • 20241016 模板清理
    区间DP-回文字串记\(f[i][j]\)表示把\(s[i\simj]\)变成回文,最少补几个,从\(f[i][j-1],f[i+1][j],f[i+1][j-1]\)三种情况转移过来即可。感性理解一下这样的状态定义是有最优子结构的。区间DP-合唱队肯定可以区间\(dp\),再注意到状态的转移和上一步有关,所......
  • 10.16学习日志
    一.Python函数1.定义一个函数什么是函数函数是可以重复执行的语句块,可以重复调用作用用于封装语句块,提高代码的重用性。函数是面向过程编程的最小单位1.1def语句作用用来定义(创建)函数语法说明函数代码块以def关键词开头,后接函数标识符名称和圆括......
  • 2024.10.16 模拟赛
    2024.10.16模拟赛T1divide简要题意给定一棵树的\(n\)个结点以及每个结点的\(fa_i\),每个点的点权\(v_i\),删除树中的两条边,将树拆分为三个非空部分。每个部分的权值等于该部分包含的所有节点的权值之和。出一种合理的拆分方案。根节点的\(fa_i=0\)\(n≤10^6\)solution......
  • [20241016]Oracle C functions annotations补充.txt
    [20241016]OracleCfunctionsannotations补充.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/Frits......
  • 2024/10/16 模拟赛总结
    \(30+0+40+40=100\),T4没看到输入不按顺序痛失\(35\)pts#A.最终测试很少见到不要dp的期望了直接枚举每一个人的四种情况,二分查找有多少种情况有多少人分比他高,最后除以\(16\)即可\(16\)是两个人的所有情况,即\(4\times4\)//BLuemoon_#include<bits/stdc++.h>......
  • 10.16 补题记录
    https://codeforces.com/gym/105386/problem/EE题:要求gcd最大值然后可以改变一次数组使选中的那一节增大k,然后我们一开始想dp[i][0/1][0/1]来维护前i个里这个数加k/不加k,以及之前加k/不加k,看起来非常的完美吧然后wa15了,是因为我们每次只记录了一个点的一种值但是一个点有可能......
  • 10.16 模拟赛
    炼石计划9月29日NOIP模拟赛#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1有80的暴力。想了一会正解但不会做于是放弃了。T2。怎么这么像双栈排序?操作3是什么鬼?\(n\le5\)爆搜不会打?不管了先跳了。T3。一眼蒙德里安的梦想+矩阵加速。复杂度未知,说不定是正解,不......
  • Linux命令(10.16)
    linux命令ifconfig查看IP地址serviceiptablesstop关闭防火墙serviceiptablesstart开启防火墙serviceiptablesrestart重启防火墙serviceiptablesstatus查看防火墙状态ssh+ip地址链接虚拟机su切换用户名su+root切换超级用户cat/etc......
  • 20241016 模拟赛总结
    期望得分:100+100+55(?)+0=255实际得分:100+100+0+0=200迷迷糊糊睡了好一会才起来打……感觉打的还行,除了T3时间太紧了,有的错误没检查出来挂分了。。T1简单线性DP。\(f_i\)表示前i个数的答案,\(g_i\)有点抽象,先假设当前在\(p\),\(a_p=i\),\(g_i\)表示的是如果\(p\)......
  • 2024/10/16 日 日志 --》关于Mysql的中DQL的初步学习笔记与整理
    在前几天已经进行了Mysql的初步准备和学习,接下来我将继续向后推进。以下为课程学习整理,方便记忆和复习。点击查看代码-------DQL----基础查询--1.查询多个字段--SELECT字段列表form表名 ;--selcet*form表名;--查询所有数据--2.去除重复记录--selectdist......