费马小定律求逆元

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,p,inv[3001000];
ll rd(){
    ll x=0,fl=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fl=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*fl;
}
/*费马小。会T*/
/*ll ksm(ll x,ll y){
    ll cnt=1;
    while(y){
        if(y&1)cnt=(ll)(cnt*x)%p;
        x=(ll)(x*x)%p;
        y=y>>1;
    }
    return cnt;
}
int main(){
    n=rd();p=rd();
    for(ll i=1;i<=n;i++)
        printf("%lld\n",ksm(i,p-2));
    return 0;
}*/

int main(){
    n=rd();p=rd();
    printf("1\n");inv[1]=1;
    for(int i=2;i<=n;i++){
        inv[i]=(ll)(p-p/i)*inv[p%i]%p;
        printf("%lld\n",inv[i]);
    }
    return 0;
}
/*
详细证明

设t=P/it=P/i
k=P \mod ik=Pmodi
显然有

t*i+k \equiv 0 (\mod P)t?i+k≡0(modP)
k \equiv -t*i(\mod P)k≡?t?i(modP)
两侧同除i*ki?k,并把tt和kk带入

inv[i] \equiv -p/i*inv[p \mod i] (\mod p)inv[i]≡?p/i?inv[pmodi](modp)
这里需要注意一个事情,

对于 a\mod pamodp当a<0a<0时,

应为(a+p) \mod p(a+p)modp
把原式的\mod pmodp消掉,得

inv[i]=P-P/i*inv[P\mod i]
inv[i]=P?P/i?inv[Pmodi]
这样就可以进行线性的递推啦
*/

  

时间: 2024-08-11 21:16:50

费马小定律求逆元的相关文章

HDU - 1576(费马小定理求逆元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9278    Accepted Submission(s): 7452 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%99

UVALive-3722 留个坑,为什么费马小定理求逆元不对??

#include <iostream> #include <cstdlib> #include <queue> #include <algorithm> #include <cmath> #include <fstream> #define inf 2147483647 #define N 1000010 #define p(a) putchar(a) #define For(i,a,b) for(long long i=a;i<

[CodeVs1515]跳(lucas定理+费马小定理+乘法逆元)

嘿嘿嘿好久没写数学题了,偶尔看到一道写一写... 题目大意:一个(n+1)*(m+1)[0<=n, m<=10^12,n*m<=10^12]的矩阵,C(0,0)=1,C(x,y)=C(x-1,y)+C(x,y-1),求从0,0走到n,m路上最小权值(即为前面的C)和mod 10^9+7. 看到这个C(x,y)=C(x-1,y)+C(x,y-1),第一反应就是杨辉三角,所以这个矩阵其实就是一个由组合数组成的矩阵,第i行第j列的权值为C(i+j,j)[注意这个矩形起点是(0,0)]. 我们可

费马小定理 求乘法逆元

//P3811 [模板]乘法逆元 #include<bits/stdc++.h> using namespace std; inline void write(long long X) { if(X<0) {X=~(X-1); putchar('-');} if(X>9) write(X/10); putchar(X%10+'0'); } long long qpow(long long n,long long m,long long mod) { long long ans=1;

求逆元的四种算法(拓欧费马小线性推欧拉)

求逆元的四种算法 拓展欧几里得算法求逆元 上一篇博客中已经讲过拓展欧几里得算法,并且讲解了求逆元的原理.这里只列出代码 在要求逆元的数与p互质时使用 代码 //扩展欧几里得定理 int ex_gcd(int a,int b,int& x,int& y) { if(b==0) { x=1; y=0; return a; } int ans = ex_gcd(b,a%b,x,y); int tmp = x; x = y; y = tmp-a/b*y; return ans; } int cal

51nod A 魔法部落(逆元费马小定理)

A 魔法部落 小Biu所在的部落是一个魔法部落,部落中一共有n+1个人,小Biu是魔法部落中最菜的,所以他的魔力值为1,魔法部落中n个人的魔法值都不相同,第一个人的魔法值是小Biu的3倍,第二个人的魔法值是第一个人的3倍,以此类推. 现在小Biu想知道整个部落的魔法值和是多少?由于答案比较大,请把答案对1e9+7取模之后输出. 收起 输入 输入一个数N(0 <= N <= 10^9) 输出 输出:整个部落的魔法值和模1e9+7. 数据范围 对于20%的数据,n<=100: 对于40%的数

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

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色

【日常学习】乘法逆元&amp;&amp;欧拉定理&amp;&amp;费马小定理&amp;&amp;欧拉函数应用&amp;&amp;常大学霸

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看看 今天花了一个多小时终于把乘法逆元捣鼓明白了 鉴于我拙计的智商抓紧把这些记录下来 在此本栏目鸣谢里奥姑娘和热心网友himdd的帮助和支持 那么正文开始··· 逆元是干什么的呢? 因为(a/b)mod p ≠(a mod p)/(b mod p) 我们需要想一种方法避免高精 那就是把除法转化为乘法 因为(a*b) mod p = ( a mod p ) *( b mod p ) 怎么转化呢?