适合单个的,费马小定理,exgcd,都是不错的选择,利用积性函数的方法和欧拉筛的方法适合批量求,但是论时间和空间的话,还是积性函数的方法比较好用,线性的。

题目链接:https://www.luogu.org/problemnew/show/P3811

方法一(超时)(适合求单个):费马小定理
当p为素数的时候,a^(p-1)=1(在模p的情况下),所以我们就可以推导出,a*a^(p-2)=1,所以a的逆元就是a^(p-2)。

代码:

 #include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 1e5+;
ll quickpow(ll t1,ll t2,ll t){
ll ans=t1%t;
t2--;
while(t2){
if(t2&)ans=ans*t1%t;
t1=t1*t1%t;
t2>>=;
}
return ans%t;
}
ll inv(ll t,ll mod){
return quickpow(t,mod-,mod)%mod;
}
int main(){
ll n,p;
scanf("%lld %lld",&n,&p);
for(int i=;i<=n;i++){
printf("%lld\n",inv(i,p));
}
return ;
}

方法二(超时)(适合求单个):扩展欧几里得

a*x=1(mod p),我们可以列出等式,a*x+p*y=1,利用扩展欧几里得,直接求出x。

代码:

 #include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 1e5+;
ll x,y;
void exgcd(ll t1,ll t2,ll mod)
{
if(t2==)
{
x=;
y=;
return ;
}
exgcd(t2,t1%t2,mod);
ll tmp=x%mod;
x=y%mod;
y=(tmp-t1/t2*y%mod+mod)%mod;
}
ll inv(ll t,ll mod)
{
exgcd(t,mod,mod);
return x%mod;
}
int main()
{
ll n,p;
scanf("%lld %lld",&n,&p);
for(int i=; i<=n; i++)
{
printf("%lld\n",inv(i,p));
}
return ;
}

方法三(AC)(可批量求):积性函数

证明方法如下图所示:

AC代码:

 #include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e7+;
ll inv[maxn];
int main()
{
ll n,p;
scanf("%lld %lld",&n,&p);
inv[]=;
for(int i=;i<=n;i++){
inv[i]=((p-p/i)*inv[p%i]+p)%p;
}
for(int i=;i<=n;i++){
printf("%lld\n",inv[i]);
}
return ;
}

 方法四:

欧拉筛(可批量求)

AC代码:

 #include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e7+;
ll inv[maxn],prim[maxn],vis[maxn];
ll quickpow(ll t1,ll t2,ll mod)
{
if(!t2)return ;
ll now=quickpow(t1,t2>>,mod);
now=now*now%mod;
if(t2&)now=now*t1%mod;
return now%mod;
}
int main()
{
ll n,p;
scanf("%lld %lld",&n,&p);
vis[]=;
inv[]=;
int num=;
for(ll i=; i<=n; i++)
{
if(vis[i]==)
{
prim[++num]=i;
inv[i]=quickpow(i,p-,p);
}
for(ll j=; j<=num; j++)
{
if(i*prim[j]>n)
break;
ll tmp=i*prim[j];
vis[tmp]=;
inv[i*prim[j]%p]=inv[i]*inv[prim[j]]%p;
if(i%prim[j]==)
break;
}
}
for(int i=; i<=n; i++)
{
printf("%lld\n",inv[i]);
}
return ;
}

乘法逆元(P3811)(四种方法)的更多相关文章

  1. 两个变量交换的四种方法(Java)

    对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...

  2. 织梦DedeCMS模板防盗的四种方法

    织梦(DedeCMS)模板也是一种财富,不想自己辛辛苦苦做的模板被盗用,在互联网上出现一些和自己一模一样的网站,就需要做好模板防盗.本文是No牛收集整理自网络,不过网上的版本都没有提供 Nginx 3 ...

  3. 让一个图片在div中居中(四种方法)

    第一种方法: <div class="title"> <div class="flag"></div> <div cl ...

  4. 运行jar应用程序引用其他jar包的四种方法

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...

  5. java中定时器的四种方法

    package com.lid; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ja ...

  6. Angular--页面间切换及传值的四种方法

    1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...

  7. MYSQL获取自增ID的四种方法

    MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...

  8. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

  9. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  10. IOS中Json解析的四种方法

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...

随机推荐

  1. 《Linux内核分析》第五周:分析system_call中断处理过程

    实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...

  2. 第一次冲刺阶段后五天总结和第一次 Sprint

    第一次冲刺阶段后五天总结(11.16-11.20) 一.准备实现的功能 1 在游戏中随机显示式子 点击进入答题则进入答题界面,显示式子 2 设置限时或者规定答题数目模式 进入游戏,选择不同模式 3 产 ...

  3. 第二个spring冲刺第9天

    其中一个队员在检查程序的BUG途中发现了几个重要的BUG比如答案乱码.程序闪退,弹出黑幕.于是我们决定先把这些问题解决再继续开发其他功能

  4. 编写JDBC框架:(策略设计模式)

    package com.itheima.domain; //一般:实体类的字段名和数据库表的字段名保持一致 //约定优于编码 public class Account { private int id ...

  5. [转帖]2019 简易Web开发指南

    2019 简易Web开发指南     2019年即将到来,各位同学2018年辛苦了. 不管大家2018年过的怎么样,2019年还是要继续加油的! 在此我整理了个人认为在2019仍是或者将成为主流的技术 ...

  6. 【HTML5】中的一些新标签

    1.element.classList 获取该元素的所有类名,并以数组方式列出. 增加类名:element.classList.add(class1,class2); //可添加一个或多个. 去除类名 ...

  7. windows文件共享 防火墙规则设置

    防火墙入站规则.完成以下两项设置即可. 设置一 操作:允许连接协议类型:UDP本地端口:137, 138远程端口:所有端口 设置二 操作:允许连接协议类型:TCP本地端口:139, 445远程端口:所 ...

  8. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. MT【196】整数个数

    设函数$f(x)=x^2-2ax+15-2a$的两个零点分别为$x_1,x_2$, 且在区间$(x_1,x_2)$上恰好有两个正整数,则实数$a$的取值范围______ 提示:$1<|x_1-x ...

  10. 「NOI2018」你的名字

    「NOI2018」你的名字 题目描述 小A 被选为了\(ION2018\) 的出题人,他精心准备了一道质量十分高的题目,且已经 把除了题目命名以外的工作都做好了. 由于\(ION\) 已经举办了很多届 ...