~n中持有整数在模p意义下的乘法逆元,~n中有所整数在模p意义下的乘法逆元

说明

1≤n≤3×10​6​​,n<p<20000528

输入保障 pp 为质数。

费马小定理:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 int n,p;
 8 int fast(ll a,ll b){
 9     ll ans=1;
10     while(b){
11         if(b&1)ans=(ans*a)%p;
12         a=(a*a)%p;
13         b>>=1;
14     }
15     return ans;
16 }
17 int main(){
18     scanf("%d%d",&n,&p);
19     for(int i=1;i<=n;i++)
20         printf("%d\n",fast(i,p-2));
21     return 0;
22 }

壮大欧几里得:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 void ex_gcd(int a,int b,int &x,int &y){
 7     if(b==0){x=1,y=0;return;}
 8     ex_gcd(b,a%b,x,y);
 9     int tmp=x;x=y;y=tmp-(a/b)*y;
10 }
11 int main(){
12     int a,b,x,y;
13     scanf("%d%d",&a,&b);
14     for(int i=1;i<=a;i++){
15         ex_gcd(i,b,x,y);
16         printf("%d\n",(x+b)%b);
17     }
18     return 0;
19 }

线性总括:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int ans[3000010],n,p;
 7 int main(){
 8     scanf("%d%d",&n,&p);
 9     ans[1]=1;puts("1");
10     for(int i=2;i<=n;i++){
11         ans[i]=(long long)(p-p/i)*ans[p%i]%p;
12         printf("%d\n",ans[i]);
13     }
14     return 0;
15 }

题材背景

那是一道模板题

题材叙述

给定n,p求1~n中有所整数在模p意义下的乘法逆元。

输入输出样例

输入样例#1:

10 13

出口样例#1:

1
7
9
10
8
11
2
5
3
4

【luogu 3811】【模板】乘法逆元,luogu3811乘法

输入输出格式

输入格式:

一行n,p

输出格式:

n行,第i行表示i在模p意义下的逆元。

问题叙述

给定n,p求1~n中存有整数在模p意义下的乘法逆元。

输入输出样例

输入样例#1:

10 13

输出样例#1:

1
7
9
10
8
11
2
5
3
4

输入输出样例

输入样例#1:

10 13

输出样例#1:

1
7
9
10
8
11
2
5
3
4

题材背景

那是一道模板题

输入输出格式

输入格式:

一行n,p

输出格式:

n行,第i行表示i在模p意义下的逆元。

说明

1≤n≤3×10​6​​,n<p<20000528

输入保险 pp 为质数。

费马小定理:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 int n,p;
 8 int fast(ll a,ll b){
 9     ll ans=1;
10     while(b){
11         if(b&1)ans=(ans*a)%p;
12         a=(a*a)%p;
13         b>>=1;
14     }
15     return ans;
16 }
17 int main(){
18     scanf("%d%d",&n,&p);
19     for(int i=1;i<=n;i++)
20         printf("%d\n",fast(i,p-2));
21     return 0;
22 }

扩充欧几里得:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 void ex_gcd(int a,int b,int &x,int &y){
 7     if(b==0){x=1,y=0;return;}
 8     ex_gcd(b,a%b,x,y);
 9     int tmp=x;x=y;y=tmp-(a/b)*y;
10 }
11 int main(){
12     int a,b,x,y;
13     scanf("%d%d",&a,&b);
14     for(int i=1;i<=a;i++){
15         ex_gcd(i,b,x,y);
16         printf("%d\n",(x+b)%b);
17     }
18     return 0;
19 }

线性总计:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int ans[3000010],n,p;
 7 int main(){
 8     scanf("%d%d",&n,&p);
 9     ans[1]=1;puts("1");
10     for(int i=2;i<=n;i++){
11         ans[i]=(long long)(p-p/i)*ans[p%i]%p;
12         printf("%d\n",ans[i]);
13     }
14     return 0;
15 }

输入输出格式

输入格式:

一行n,p

输出格式:

n行,第i行表示i在模p意义下的逆元。

标题叙述

给定n,p求1~n中有所整数在模p意义下的乘法逆元。

难点背景

那是一道模板题

说明

1≤n≤3×10​6​​,n<p<20000528

输入保障 pp 为质数。

费马小定理:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 int n,p;
 8 int fast(ll a,ll b){
 9     ll ans=1;
10     while(b){
11         if(b&1)ans=(ans*a)%p;
12         a=(a*a)%p;
13         b>>=1;
14     }
15     return ans;
16 }
17 int main(){
18     scanf("%d%d",&n,&p);
19     for(int i=1;i<=n;i++)
20         printf("%d\n",fast(i,p-2));
21     return 0;
22 }

扩张欧几里得:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 void ex_gcd(int a,int b,int &x,int &y){
 7     if(b==0){x=1,y=0;return;}
 8     ex_gcd(b,a%b,x,y);
 9     int tmp=x;x=y;y=tmp-(a/b)*y;
10 }
11 int main(){
12     int a,b,x,y;
13     scanf("%d%d",&a,&b);
14     for(int i=1;i<=a;i++){
15         ex_gcd(i,b,x,y);
16         printf("%d\n",(x+b)%b);
17     }
18     return 0;
19 }

线性总结:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int ans[3000010],n,p;
 7 int main(){
 8     scanf("%d%d",&n,&p);
 9     ans[1]=1;puts("1");
10     for(int i=2;i<=n;i++){
11         ans[i]=(long long)(p-p/i)*ans[p%i]%p;
12         printf("%d\n",ans[i]);
13     }
14     return 0;
15 }

http://www.bkjia.com/cjjc/1229009.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1229009.htmlTechArticle【luogu 3811】【模板】乘法逆元,luogu3811乘法
题目背景 那是一道模板题 标题叙述
给定n,p求1~n中颇具整数在模p意义下的乘法逆元。 输入输出…

相关文章