【模板】求1~n的整数的乘法逆元

洛谷3811

先用n!p-2求出n!的乘法逆元

因为有(i-1)!-1=i!-1*i (mod p),于是我们可以O(n)求出i!-1

再用i!-1*(i-1)!=i-1 (mod p)即是答案

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 const int maxn=3000010, inf=1e9;
 9 int n, p;
10 int fac[maxn], inv[maxn];
11 inline void read(int &k){
12     int f=1; k=0; char c=getchar();
13     while(c<‘0‘ || c>‘9‘) c==‘-‘&&(f=-1), c=getchar();
14     while(c<=‘9‘ && c>=‘0‘) k=k*10+c-‘0‘, c=getchar();
15     k*=f;
16 }
17 inline int power(int a, int b){
18     int ans=1;
19     for(;b;b>>=1, a=1ll*a*a%p)
20         if(b&1) ans=1ll*ans*a%p;
21     return ans;
22 }
23 int main(){
24     read(n); read(p);
25     fac[0]=1; for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%p;
26     inv[n]=power(fac[n], p-2);
27     for(int i=n;i;i--) inv[i-1]=1ll*inv[i]*i%p;
28     for(int i=1;i<=n;i++) printf("%lld\n", 1ll*fac[i-1]*inv[i]%p);
29 }

时间: 2024-10-10 04:47:30

【模板】求1~n的整数的乘法逆元的相关文章

CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+快速幂)

C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vitaly is a very weird man. He's got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal

分数的乘法逆元和负数的取模运算

1.乘法逆元 A.定义 如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p的乘法逆元为x. 既然有ax≡1 (mod p),那么有ax - py = 1,x是a关于模p的乘法逆元. B.分数的乘法逆元 对于实数域,一个数的乘法逆元就是其倒数,所谓乘法逆元就是相乘等于单位元的那个数. 对于ecc算法的离散曲线域,m的乘法逆元为n,满足m * n = 1 (mod p),即满足m*n mod p = 1 mod p,称作n就是m关于的p乘法逆元.在离散曲线域中,单位元

P3811 【模板】乘法逆元

P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样例#1: 10 13 输出样例#1: 1 7 9 10 8 11 2 5 3 4 说明 1≤n≤3×10?6??,n<p<20000528 输入保证 p 为质数. 我们有三种办法求逆元 由欧拉定理可知 当gcd(a,n)==1 时 我们有 Aφ(n-1)≡ 1(mod

洛谷 P3811 【模板】乘法逆元 如题

P3811 [模板]乘法逆元 时空限制1s / 256MB 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样例#1: 10 13 输出样例#1: 1 7 9 10 8 11 2 5 3 4 说明 1 \leq n \leq 3 \times 10 ^ 6, n < p < 200005281≤n≤3×106,n<p<20000528

OJ刷题之《函数模板--求n个数之和》

题目描述 利用函数模板求4个数的和. 部分代码已给定如下,只需要提交缺失的代码. #include <iostream> using namespace std; /* 补充缺少代码 */ int main() { double result; unsigned char c1,c2,c3,c4; cin>>c1>>c2>>c3>>c4; result = sum<unsigned char>(c1,c2,c3,c4); cout&l

suseoj 1207: 大整数的乘法(java, 大数相乘)

1207: 大整数的乘法 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 求两个不超过200位的非负整数的积. 输入 有两行,每行是一个不超过200位的非负整数,没有多余的前导0. 输出 一行,即相乘后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342. 样例输入 12345678900 98765432100 样例输出 1219326311126352690000 分析:

题解 P3811 【模板】乘法逆元

题意求\(i\)在模\(p\)意义下的逆元\(\frac{1}{i}\)即\(inv(i)\).题目数据范围很明显规定了要求一个线性求逆元的算法. 令\(p=ai+b\),则有: \[ai+b\equiv 0(\mod p)\] 移项得: \[ai\equiv -b(\mod p)\] 系数化简得: \[i\equiv -\frac{b}{a}(\mod p)\] 取倒数得: \[\frac{1}{i} \equiv -\frac{a}{b}(\mod p)\] 即 \[inv(i) \equi

求出10个整数中的最大值

//求出10个整数中的最大值#include <stdio.h>int main(){ int arr[10];//定义存放10个整数的数组 int i; int tmp;//定义中间变量 printf("请输入10个整数:\n"); for(i=0;i<10;i++)//数组的初始化 {  scanf("%d",&arr[i]); } for(i=0;i<10;i++)//寻找10个整数中的最大值 {  if(arr[0]<=

(c语法百题7)求两数的整数商 和 余数

知识点: 求商和求余 /   和 % 的用法. 注意 /  中,两个%d的值为整数,即取整.有%f类的,就是商了,带小数的. 内容: 求两数的整数商 和 余数 输入说明: 一行两个整数 输出说明: 一行两个整数 输入样例: 若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001. 18 4 输出样例 : 4 2 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); print