P3811 【模板】乘法逆元

题意

求1-n所有整数在模p意义下的逆元。

分析

逆元

如果x满足\(ax=1(\%p)\)(其中a p是给定的数)那么称\(x\)是在\(%p\)意义下\(a\)的逆元

A 拓展欧几里得算法

\[ax=1(\%p)
\]

转换一下也就是

\[ax+py=1
\]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int extgcd(int a,int b,int&x,int&y){
if(b==0){
x=1;
y=0;
return a;
}
int g=extgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
int main(){
int a,b,x,y;
cin>>a>>b;
for(int i=1;i<=a;i++){
extgcd(i,b,x,y);
cout<<(x%b+b)%b<<endl;
}
}

得分:48。TLE

B 费马小定理

当p是质数时:

\[a^{p-1}≡1(\%p)
\]

将其变形一下即得

\[a*a^{p-2}≡1(\%p)
\]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll p){
ll ans=1;
while(b){
if(b%2){
ans*=a;
ans%=p;
}
a*=a;
a%=p;
b>>=1;
}
return ans%p;
}
int main(){
int n,p;
cin>>n>>p;
for(int i=1;i<=n;i++){
cout<<(qpow(i,p-2,p)%p+p)%p<<endl;
}
}

得分:48。TLE

B' 欧拉定理

费马小定理只是欧拉定理的特殊情况。欧拉定理:

\[a^{\phi(p)}=1(\%p)
\]

也就是说\(a^{\phi(p)-1}\)是\(a\)在\(\%p\)意义下的逆元。

其中\(\phi\)是欧拉函数:小于n的正整数中与n互质的数的数目。

通式:\(\phi(n)=n\Pi_{i=1}^{n}\left(1-\frac{1}{p_i}\right)\)

递推性质:

  1. \(\phi(p)=p-1\) (p是质数)
  2. \(\phi(ab)=\phi(b)\phi(b)\) (a,b互质)
  3. \(\phi(ip)=p\phi(i)\) (i是p的倍数)

    所以可以用类似线性筛的方法求出欧拉函数表。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll p){
ll ans=1;
while(b){
if(b%2){
ans*=a;
ans%=p;
}
a*=a;
a%=p;
b>>=1;
}
return ans%p;
}
ll n,p;
ll phi[20000529],prime[2000052],ps;
bool mark[2000052];
void calc(){
phi[1]=1;
for(int i=2;i<=p;i++){
if(!mark[i]){
prime[++ps]=i;
phi[i]=i-1;
}
for(int j=1;j<=ps;j++){
if(i*prime[j]>p)break;
mark[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main(){
cin>>n>>p;
calc();
for(int i=1;i<=n;i++){
cout<<(qpow(i,phi[p]-1,p)%p+p)%p<<endl;
}
}

得分:32。TLE

C 神奇的递推式(正解)

\[p=ka+r
\]

然后放到\(\%p\)意义下

\[ka+r=0(\%p)
\]

两边同时乘以\(a^{-1}r^{-1}\)

\[kr^{-1}+a^{-1}=0(\%p)
\]

所以

\[a^{-1}=-kr^{-1}=-\left[\frac{p}{a}\right]*(p\%a)^{-1}
\]

转换成代码就是

inv[a]=-(p/a)*inv[p%a];

正解代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,p;
int inv[3000000];
int main(){
scanf("%d%d",&n,&p);
inv[1]=1;
printf("1\n");
for(int i=2;i<=n;i++){
inv[i]=((-((ll)p/i)*inv[p%i])%p+p)%p;
printf("%d\n",inv[i]);
}
}

[洛谷P3811]【模板】乘法逆元的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 模板【洛谷P3811】 【模板】乘法逆元

    P3811 [模板]乘法逆元 给定n,p求1~n中所有整数在模p意义下的乘法逆元. T两个点的费马小定理求法: code: #include <iostream> #include < ...

  3. 洛谷 P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下 ...

  4. 洛谷——P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...

  5. 洛谷—— P3811 【模板】乘法逆元

    https://www.luogu.org/problem/show?pid=3811 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式 ...

  6. 【洛谷P3811】[模板]乘法逆元

    乘法逆元 题目链接 求逆元的三种方式: 1.扩欧 i*x≡1 (mod p) 可以化为:x*i+y*p=1 exgcd求x即可 inline void exgcd(int a,int b,int &a ...

  7. 乘法逆元-洛谷-P3811

    题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样 ...

  8. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  9. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

随机推荐

  1. 使用python操作json文本文件

    使用python读写文本文件内容时,我们知道如果文本文件里的内容无规律,那么修改起来比较麻烦.但是如果文本文件存储是有规律的,比如JSON格式,在利用python内置的函数把JSON格式的数据转成py ...

  2. python 随机分类

    #encoding:utf-8import pandas as pdimport numpy as npfrom sklearn import datasets,linear_modelfrom sk ...

  3. [golang note] 流程控制

    流程控制 • 流程控制语句作用 ▪ 选择:根据条件跳转到不同的执行序列. ▪ 循环:根据条件反复执行某个序列. ▪ 跳转:据条件返回到某执行序列. • 流程控制语句类型 ▪ 条件语句:关键字为if.e ...

  4. 前端调试利器——BrowserSync

    此处记录一下踩过的坑 之前看的这个地址:http://www.browsersync.cn/ 也就是 BrowserSync的官网上面关于代理服务器的例子不管怎么试都不行 请看下例子 browser- ...

  5. crm 使用stark组件

    # Create your models here. from django.db import models class Department(models.Model): "" ...

  6. HDU 4585 Shaolin(map应用+二分)

    题目大意:原题链接 初始少林最开始只有一个老和尚,很多人想进少林,每个人有一个武力值,若某个人想进少林,必须先与比他早进去的并且武力值最接近他的和尚比武, 如果接近程度相同则选择武力值比他小的,按照进 ...

  7. XDU 1140 寻找万神(字符串匹配)

    学会strstr的使用 strstr(str1,str2)函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL. #include ...

  8. 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  9. Hive练习

    一.基础DDL练习 SHOW DATABASES; CREATE DATABASE IF NOT EXISTS db1 COMMENT 'Our database db1'; SHOW DATABAS ...

  10. Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子: def decorator_a(func): print 'Get in decorator_a' def ...