当前位置: 首页 > news >正文

数据结构与算法:逆元、除法同余和容斥原理

前言

马上就要到线段树了,有点紧张()

一、逆元和除法同余

在一些组合数学的题目里,往往需要求解组合数。而又因为一阶乘数据会很大,所以往往这类题需要进行取模操作。而因为公式中存在除法,除法同余又和加减乘同余都不一样,此时就需要用到逆元的知识来求解除法同余了。

组合数学的题永远做不出来呜呜呜……

1.逆元

如果想要求解a除以b取模,首先必须保证a除以b可以整除,其次需要保证模的数MOD为一个质数,最后还需要保证b和MOD的最大公约数为1,以上这三点往往题目本身就会保证,不需要做题时再考虑了。

之后,若想求解(10/5)%3,因为10除以5和10乘以1/5结果一致,所以抽象一点说逆元的思路就是找一个数代替1/5和10去乘。直接说结论,b的逆元就是b的MOD-2次方中间每步取模的结果。所以在求解的过程中还需要用到乘法快速幂。

2.除法同余

求出逆元后,a除以b再取模的除法同余就可以转化成用a乘以b的逆元再取模。

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;const int MOD=41;//质数//验证方法
int solve1(ll a,ll b)
{return (a/b)%MOD;
}//乘法快速幂
ll power(ll x,int n)
{ll ans=1;while(n>0){if((n&1)!=0){ans=(ans*x)%MOD;}x=(x*x)%MOD;n>>=1;}return ans;
}int solve2(ll a,ll b)
{ll inv=power(b,MOD-2);return (a*inv)%MOD;
}void test()
{cout<<"Start"<<endl;ll b=3671613;ll a=67312*b;cout<<solve1(a,b)<<endl;cout<<solve2(a,b)<<endl;cout<<"Over"<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;//cin>>t;// while(t--)// {//     solve();    // }test();return 0;
}

可以得到答案均为31,但若MOD为一个合数,答案就会出现错误。

3.逆元的线性递推——模意义下的乘法逆元

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{int n,p;scanf("%d%d",&n,&p);//inv[i]:数字i的逆元//inv[1]=1//inv[i]=(p-inv[p%i]*(p/i)%p)//逆元vector<ll>inv(n+1);inv[1]=1;for(int i=2;i<=n;i++){inv[i]=(p-inv[p%i]*(p/i)%p);}for(int i=1;i<=n;i++){printf("%d\n",inv[i]);}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;//cin>>t;while(t--){solve();    }return 0;
}

线性递推的这个公式没啥好说的,背过就行。

注意,这道题卡常卡的特别严重,必须用scanf和printf才能通过。

4.逆元的阶乘递推

#include <bits/stdc++.h>
using namespace std;
http://www.dtcms.com/a/276416.html

相关文章:

  • 指令微调时,也要考虑提示损失
  • Linux - 安全排查 3
  • 用 MATLAB 模拟传染病传播:从 SI 模型到 SIS 模型的可视化之旅
  • 【无标题】基于拓扑膨胀-收缩对偶性(TED),TED原理构建任意维度TQCD模型并推演宇宙可能性的完整方案:
  • 网络连接:拨号连接宽带PPPOE
  • 数据库索引创建与使用详细笔记
  • Linux的NetworkManager的nmcli配置网桥(bridge) 笔记250712
  • 【6.1.1 漫画分库分表】
  • 挖矿病毒判断与处理 - 入门
  • 26-计组-寻址方式
  • 暑假Python基础整理 -- 函数篇
  • 【6.1.2 漫画分布式事务技术选型】
  • 常用 pkill 命令速查表
  • CentOS 系统紧急恢复:从 lib64 目录崩溃到救援实战
  • vue3 canvas 选择器 Canvas 增加页面性能
  • 用FunctionCall实现文件解析(三):ChatOpenAI单例工厂
  • lnmp环境搭建
  • 使用Pycharm集成开发工具远程调试部署在虚拟机上的flask项目:超级详细的完整指南
  • springboot AOP面向切面编程
  • SpringAI实现聊天记录保存到MySQL
  • 连接池的核心接口和常用属性
  • ReentrantLock 源码解析与 AQS 扩展
  • 首次让机器人具备类人的「主动感知」能力
  • 淘宝商品评论API接口操作详解
  • oc分类和swift扩展有哪些区别
  • 火山引擎:字节跳动的技术赋能初解
  • AI智能体 | 使用Coze制作一键生成单词洗脑循环视频,一天批量生成100条视频不是梦!(附保姆级教程)
  • NW728NW733美光固态闪存NW745NW746
  • HashMap的原理
  • 技术面试问题总结二