数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

虽然作业还没有做完,但是我还是放不下它,对此,我只想说:
今天你对作业爱理不理,明天它就让你补到飞起
在这里插入图片描述

DP先放放,我们要雨露均沾

  • 练习上手:乘法逆元
    • 题目
    • 题解
    • 代码实现
  • 曹冲养猪?(互质的中国剩余定理)
    • 题目
    • 题解
    • 代码实现
  • Strange Way to Express Integers(不互质的中国剩余定理)
    • 题目
    • 题解
    • 代码实现

练习上手:乘法逆元

题目

在这里插入图片描述
在这里插入图片描述

题解

对于这种求[1,n]区间的乘法逆元,
费马小定理?
在这里插入图片描述
扩展欧几里得?
在这里插入图片描述
这两种对于求单个是比较有用的,O(nlogn)
但是对于这种区间求解就需要O(n)的线性筛了

for ( int i = 2;i <= n;i ++ )inv[i] = inv[p % i] * ( p - p / i ) % p;

至于为什么是这样子的,我们来进行简单推理:
首先应该要了解
对于数字A,B存在A∗X≡1(modBA*X≡1(mod BAX1modB),则称X为A对B的逆元。
一般这个乘法逆元是运用在需要取模而过程中又涉及到除法运算的时候,
将其转化为乘法计算

进入证明?:

T=p/i,K=pT=p/i,K=pT=p/i,K=p%iii
则有K+T∗i=pK+T*i=pK+Ti=p,被除数等于商乘除数加余数
K+T∗i≡0(modK+T*i≡0 (modK+Ti0(mod p)p)p)
变形:K≡−T∗i(modK≡-T*i(modKTi(mod p)p)p)
两边同时除以i∗Ki*KiK
–>1/i≡−T/K(mod1/i≡-T/K(mod1/iT/K(mod p)p)p)
1/i1/i1/i就是i的逆元,
因为这两个相乘取模p同余1,同时:除以K就相当于乘以K的逆元
接下来,将T=p/i,K=pT=p/i,K=pT=p/i,K=p%iii带入进去?
inv[i]=−p/i∗inv[pinv[i]=-p/i*inv[pinv[i]=p/iinv[p%i]i]i](mod p)p)p)
为了防止出现负数,就加一个p∗inv[pp * inv[ppinv[p%i]i]i],利用取模的运算律
inv[i]=inv[pinv[i] = inv[pinv[i]=inv[p%i]∗(p−p/i)i] * ( p - p / i )i](pp/i)%ppp

在这里插入图片描述

代码实现

#include <cstdio>
#define LL long long
#define MAXN 3000005
int n, p;
LL inv[MAXN];
int main() {scanf ( "%d %d", &n, &p );inv[1] = 1;printf ( "1\n" );for ( int i = 2;i <= n;i ++ ) {inv[i] = inv[p % i] * ( p - p / i ) % p;printf ( "%lld\n", inv[i] );}return 0;
}

ok,让我们随着难度的增加慢慢深入,就先去养养?,体验农村生活
在这里插入图片描述

曹冲养猪?(互质的中国剩余定理)

题目

在这里插入图片描述
在这里插入图片描述

题解

这道题,还好还好,麻痹自己,模板也是可以自己,慢慢看懂的,我就不多证明了,
主要是我懒得打了。。。

取模定理:两数不能整除,若被除数扩大(或缩小)了几倍,而除数不变,则其商和余数也同时扩大(或缩小)相同的倍数(余数必小于除数)。
如果a%b=c,那么如果x%b=c * 2,此时有x=a * 2;
转化为求通解问题,即:
求解同余方程组
x≡ a1​(mod m1​)
x≡ a2​(mod m2​)
x≡ a3​(mod m3​)

x≡ ak​(mod mk​)​
其中m1,m2,m3…mk为两两互质的整数求x的最小非负整数解
在这里插入图片描述
M是输入的所有m[i]的乘积,Ti是M/mi的逆元
在这里插入图片描述
在这里插入图片描述
接下来就是模板套上去就可以了,在这里我只想补充,int128是个好玩意儿啊!!
在这里插入图片描述

代码实现

#include <cstdio>
#define MAXN 15
#define LL __int128
int n;
int m[MAXN], r[MAXN];void print ( LL x ) {if ( x > 9 )print ( x / 10 );putchar ( ( x % 10 ) + '0' );
}void exgcd ( LL a, LL b, int &x, int &y ) {if ( ! b ) {x = 1;y = 0;return;}exgcd ( b, a % b, y, x );y -= ( a / b ) * x;
} int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d %d", &m[i], &r[i] );LL lcm = 1, ans = 0;int x, y;for ( int i = 1;i <= n;i ++ )lcm = lcm * m[i];for ( int i = 1;i <= n;i ++ ) {LL tp = lcm / m[i];exgcd ( tp, m[i], x, y );x = ( x % m[i] + m[i] ) % m[i];ans = ( ans % lcm + tp * r[i] % lcm * x % lcm ) % lcm;}LL res = ( ans % lcm + lcm ) % lcm;print ( res );return 0;
} 

Strange Way to Express Integers(不互质的中国剩余定理)

题目

在这里插入图片描述
在这里插入图片描述

题解

那么,当模数不两两互质
即求:
解同余方程组
x≡ a1​(mod m1​)
x≡ a2​(mod m2​)
x≡ a3​(mod m3​)…
x≡ ak​(mod mk​)​
其中m1,m2,m3…mk是不一定两两互质的整数求x的最小非负整数解
我们先考虑:只有两个数该怎么处理
可以得到:
x=a1+k1∗m1x=a1+k1*m1x=a1+k1m1
x=a2+k2∗m2x=a2+k2*m2x=a2+k2m2
k2∗m2−k1∗m1=a1−a2k2*m2-k1*m1=a1-a2k2m2k1m1=a1a2
四不四很像 ax+by=cax+by=cax+by=c
设m1,m2的gcd为g,a1−a2=ca1-a2=ca1a2=c
1)当c不是g的倍数时,exgcd无解
2)如果是,
在这里插入图片描述
则用exgcd求出k2∗m2+(−k1)∗m1=gcd(m1,m2)k2*m2+(-k1)*m1=gcd(m1,m2)k2m2+(k1)m1=gcd(m1,m2)
因为c是g的倍数,两边同时乘以一个c/g,即k1乘上c/g得到
k2∗m2+(−k1)∗m1=c解为−k1k2*m2+(-k1)*m1=c解为-k1k2m2+(k1)m1=ck1

X=a1−k1∗m1X=a1-k1*m1X=a1k1m1
这样就求出了x。
我们设这个x为x0
所以,可以得到的通解为x=x0+k∗lcm(m1,m2)x=x0+k*lcm(m1,m2)x=x0+klcm(m1,m2)

将这个方程转化一下,可以得到一个新的同余方程
x=x0(modx=x0(modx=x0(mod lcm(m1,m2))lcm(m1,m2))lcm(m1,m2))

我们便成功的将两个方程转化为了一个方程
后面以此类推,得到最后一个x0,即为我们所需要的答案。

上模板讲解?
M是上一次的最小公倍数lcm
R是上一次的x0,及我们的当前答案

R = a[1], M = m[1];
FOR(1~N)
gcd = exgcd ( M, m[i], x, y );
//k2*m2+(-k1)*m1=gcd(m1,m2),这里M就是m1,m[i]就是m2,x,y是对应的k系数
c = R - a[i];
x = c / gcd * x % m[i];
//x此时就是k2*m2+(-k1)*m1=c中的-k1
R -= x * M;
//更新新的X答案m,X=a1-k1*m1(如果是➖,参照这个方程),
//x=x0+k*lcm(m1,m2)(如果是➕,参照这个方程)
M = M / gcd * m[i];
//更新新的lcm
R %= M;

在这里插入图片描述

代码实现

#include <cstdio>
#define MAXN 100005
#define LL long long
int n;
int m[MAXN], a[MAXN];LL exgcd ( LL a, LL b, LL &x, LL &y ) {if ( ! b ) {x = 1;y = 0;return a;}LL d = exgcd ( b, a % b, y, x );y -= ( a / b ) * x;return d;
} LL gcd, R, M, x, y, c;int main() {while ( scanf ( "%d", &n ) != EOF ) {bool flag = 0;for ( int i = 1;i <= n;i ++ )scanf ( "%d %d", &m[i], &a[i] );R = a[1], M = m[1];for ( int i = 2;i <= n;i ++ ) {gcd = exgcd ( M, m[i], x, y );c = R - a[i];if ( c % gcd ) {flag = 1;printf ( "-1\n" );break;}x = c / gcd * x % ( m[i] / gcd );R -= x * M;M = M / gcd * m[i];R %= M;}if ( ! flag )printf ( "%lld\n", ( R % M + M ) % M );} return 0;
} 

好了,我已经被榨干了,去做其他的DP和数论了,ヾ( ̄▽ ̄)ByeBye
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发.NET Core NuGet包并实现CI/CD

实际开发中我们需要对一些公共类库进行开发&#xff0c;并基于Jenkins进行CI/CD&#xff08;CI:持续集成&#xff0c;CD:持续部署&#xff09;,其他项目通过NuGet引用。上文讲述了如何搭建本地NuGet服务器并发布NuGet包&#xff0c;这里不再赘述。CI/CD流程如下图&#xff1a;首…

acwing221 龙哥的问题

acwing221 龙哥的问题 文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;题目&#xff1a; 题解&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll;int phi(int x) {int ansx;for(int i2;(ll)i*i<x;i)if(x%…

DP专练3:征途

虽然只有1道题&#xff0c;但是含金量还是够够di 文章目录题目题解代码实现题目 题解 我们直接对答案输出格式进行处理&#xff1a;设第 iii 天走的路程为 aia_iai​&#xff0c;总路程为 S∑i1nleniS\sum_{i1}^nlen_iS∑i1n​leni​&#xff0c;那么 v∑i1m(ai−Sm)2mv∑_{i1…

云时代的.NET

编程语言从最初的0101机器码到汇编语言再到面向对象的编程&#xff0c;不断的发展&#xff0c;整个发展趋势呈现高内聚、低耦合、可重用、可理解的特点。最早编程是用机器码&#xff0c;人的大脑不像电脑&#xff0c;无法处理0101&#xff1b;后来汇编语言还是太费解&#xff0…

研究性学习:APP的隐私问题

文章目录写在前面背景&#xff08;problem&#xff09;一个实例(example)手机App用户输入隐私数据的识别与检测技术研究&#xff08;solution&#xff1f;&#xff09;&#xff08;官方&#xff09;概览背景介绍4.系统设计隐私政策引言1.收集信息2. 信息使用3. 信息披露4. 信息…

DP专练4:[SCOI 2010]股票交易(单调队列优化dp)

昨天晚上&#xff0c;初见它时&#xff0c;月黑风高&#xff0c;一个电脑&#xff0c;一支笔&#xff0c;一个人 今天秋高气爽&#xff0c;再一瞥&#xff0c;回眸间 我又来了&#xff0c;honey题目题解代码实现题目 题解 首先这种 iii 天与前面 jjj 天有关联&#xff0c;而…

【做题记录】[NOIP2016 普及组] 魔法阵

P2119 魔法阵 2016年普及组T4 题意&#xff1a; 给定一系列元素 \(\{X_i\}\) &#xff0c;求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 。 \[\begin{cases}X_a<X_b<X_c<X_d \\ X_a-X_b2\times (X_d-X_c) \\X_b-X_a<\dfrac{X_c-X_b}{3}\end{cases} \]…

“被狗啃”的按钮引发的开源社区信任危机

昨天&#xff0c;在国外民众还在欢度圣诞期间&#xff0c;开发者社区却对 Antd 开发团队发起了连番的炮轰。一觉醒来&#xff0c;他们发现由自己参与设计的、公司内网、办事系统等网页上&#xff0c;有一些按钮的上面多了一团白色的“积雪”&#xff0c;在白背景下&#xff0c;…

[COCI2017-2018#5] Pictionary(并查集+dfs)

贼ex的一道&#xff0c;卡了本仙女整整7个小时orz 思路容易理解&#xff0c;but码力very重要orz 我愿意花五毛钱提升我的码力&#xff0c;换个脑子也行&#xff0c;不换脸这张脸生得俊俏 luogu传送door 题目 在宇宙一个不为人知的地方&#xff0c;有一个星球&#xff0c;上面…

Docker最全教程——从理论到实战(九)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…

[2019CSP多校联赛普及组第五周] 调度CPU (贪心)

来来来&#xff0c;走过路过不要错过题目题解代码实现1代码实现2题目 ⼩Y同学有⼀块超级CPU&#xff0c;它有两个超级核⼼A和B。 A核⼼可以同时处理多项任务&#xff0c;每项任务处理时间为x&#xff0c;B核⼼只能同时处理⼀项任务&#xff0c;每项任务处理时间为y。 这⼀天…

NumSharp v0.6.1 科学计算库发布,支持标量和隐式转换

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[Luogu2279][HNOI2003] 消防局的设立

文章目录题目法一&#xff1a;树上DP思路代码实现法二&#xff1a;贪心 搜索思路代码实现题目 2020年&#xff0c;人类在火星上建立了一个庞大的基地群&#xff0c;总共有n个基地。起初为了节约材料&#xff0c;人类只修建了n-1条道路来连接这些基地&#xff0c;并且每两个基…

dnSpy 强大的.Net反编译软件

一说起.net的反编译软件&#xff0c;大家首先想到的就是Reflector&#xff0c;ILSpy&#xff0c;dotPeek等等。而dnSpy同样是一款优秀的反编译软件&#xff0c;同时它是开源免费的。官方的描述是: dnSpy是一个调试器和.NET组件编辑器。 即使您没有任何可用的源代码&#xff0c;…

小奇探险

文章目录题目题解代码实现题目 小奇去遗迹探险&#xff0c;遗迹里有N个宝箱&#xff0c;有的装满了珠宝&#xff0c;有的装着废品。 小奇有地图&#xff0c;所以它知道每一个宝箱的价值&#xff0c;但是它不喜欢走回头路&#xff0c;所以要按顺序拿这N个宝箱中的若干个。 拿宝…

基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)

紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller&#xff0c;那么是否在该程序中&#xff0c;服务都按照Asp.Net Core 中的Web Api的方式…

[NOIP 2009 提高组]最优贸易

勤劳的一更题目题解代码实现题目 C国有 n个大城市和 m 条道路&#xff0c;每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的道路在统计条数…

Azure Service Fabric Mesh:一个构建任务关键型微服务的平台

本文要点Azure Service Fabric Mesh&#xff08;目前处于预览阶段&#xff09;是一个完全托管的服务&#xff0c;它使你可以使用“无服务器”方法构建、部署和管理由运行在容器中的多语言服务组成的应用程序。Azure Service Fabric Mesh 通过使用 Envoy Proxy 构建的软件定义网…

P3265 [JLOI2015]装备购买

题目描述&#xff1a; 给N个整数向量&#xff0c;每个向量带权值&#xff0c;求权值和最小的线性基 题解&#xff1a; 按权值v从小->大排序&#xff0c;依次插入线性基。整数线性基的思想类似&#xff0c;只是此时“消去”不能直接xor完成&#xff0c;需要类似高斯消元一样…

Surging1.0发布在即,.NET开发者们,你们还在等什么?

开源&#xff0c;是近三十年来互联网经久不衰的话题。它不仅仅是一种技术分享的形态&#xff0c;更是一种开放&#xff0c;包容&#xff0c;互利共赢的互联网精神。 不到30年前&#xff0c;大神林纳德托瓦兹&#xff0c;在赫尔辛基大学实验室里&#xff0c;开发出了第一个版本的…