欧拉函数:

  φ(p)表示小于p的正整数中与p互质的数的个数,称作欧拉函数。

  求单个数的欧拉函数时可以利用来求

  其中pi为p分解出的质因数,ki表示该质因数的指数

  代码:

#include<cstdio>
#include<iostream>
using namespace std;
int phi[];
int Eurl(int x)
{
int ans=;
for(int i=;i*i<=x;++i)
{
if(x%i==)
{
x/=i;
ans*=i-;
}
while(x%i==)
{
x/=i;
ans*=i;
}
}
if(x!=) ans*=(x-);
return ans;
}
int main()
{
int n=;
while()
{
scanf("%d",&n);
if(!n) break;
printf("%d\n",Eurl(n));
}
return ;
}

单个欧拉函数

  还可以求范围内的欧拉函数

  代码:

#include<cstdio>
#include<iostream>
using namespace std;
int phi[];
int main()
{
int l,r;
scanf("%d%d",&l,&r);
for(int i=;i<=r;++i)
phi[i]=i;
for(int i=;i<=r+;++i)
{
if(phi[i]==i)
{
for(int j=i;j<=r;j+=i)
{
phi[j]=phi[j]/i*(i-); } }
}
for(int i=l;i<=r;++i)
{
printf("%d %d\n",i,phi[i]);
}
return ;
}

范围内欧拉函数

逆元:

  a*a-1≡1(mod p)

  a-1叫做a在mod p 意义下的逆元。

  利用欧拉定理可知

  aφ(p)≡1(mod p)

  a*aφ(p)-1≡1(mod p)

  所以a在mop p意义下的逆元就是aφ(p)-1

   求单个逆元可以直接这样求

  一种O(n)求范围内逆元的办法:

    inv[i]=(p-p/i)*inv[p%i]%p

  证明:

    设t=p/i   k=p%i

    易知p≡0(mod p)

    所以t*i+k≡0(mod p)

    t*i≡-k(mod p)

    -t*i≡k(mod p)

    两边都乘以inv[i]和inv[k]

    -t*i*inv[i]*inv[k]≡k*inv[k]*inv[i](mod p)

    -t*inv[k]≡inv[i](mod p)

    所以就得到了

    inv[i]≡(-p/i)*inv[p%i]  (mod p)

    所以inv[i]=(p-p/i)*inv[p%i]%p

    用p-p/i是为了避免出现负数

  代码:

 #include<cstdio>
#include<iostream>
using namespace std;
int inv[];
int main()
{
int n,p;
scanf("%d%d",&n,&p);
inv[]=;
for(int i=;i<=n;++i)
inv[i]=inv[p%i]*(p-p/i)%p;
for(int i=;i<=n;++i)
printf("%d ",inv[i]);
return ;
}

范围内逆元

   一种求从1到n间阶乘的逆元的方法

    依据逆元的性质易知

      n!*n!-1≡(n-1)!*(n-1)!-1≡1(mod p)

    即 n*(n-1)!*n!-1≡(n-1)!*(n-1)!-1≡1(mod p)

    然后两边同时乘以(n-1)!-1得到

      n*n!-1≡(n-1)!-1(mod p)

    这样就可以倒着递推出范围内阶乘的逆元了

    代码:

 #include<cstdio>
#include<iostream>
using namespace std;
int jsinv[];
int fai(int k)
{
int ans=;
for(int i=;i*i<=k;++i)
{
if(k%i==)
{
ans*=i-;
k/=i;
}
while(k%i==)
{
ans*=i;
k/=i;
}
}
ans*=k;
return ans;
}
int mi(int a,int k,int p)
{
int ans=;
for(int now=a;k;k>>=,now=now*now%p)
if(k&) ans=ans*now%p;
return ans;
}
int main()
{
int n,p;
scanf("%d%d",&n,&p);
int k=;
for(int i=;i<=n;++i)
k=k*i%p;
jsinv[n]=mi(k,fai(p),p);
for(int i=n-;i>=;--i)
jsinv[i]=(jsinv[i+]*(i+))%p;
for(int i=;i<=n;++i)
printf("%d ",jsinv[i]);
return ;
}

范围内阶乘的逆元

逆元&欧拉函数的更多相关文章

  1. BZOJ 2186 沙拉公主的困惑(预处理逆元+欧拉函数)

    题意:求1-n!里与m!互质的数有多少?(m<=n<=1e6). 因为n!%m!=0,所以题目实际上求的是phi(m!)*n!/m!. 预处理出这些素数的逆元和阶乘的模即可. # incl ...

  2. BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 755  Solved: 432[Submit][Status][Discuss] ...

  3. O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

    筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1, ...

  4. POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)

    Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...

  5. BZOJ2186 欧拉函数

    欧拉函数:一般记作φ(n),表示1-n中与n互质的数的数量. 欧拉函数是积性函数,即φ(m*n)=φ(m)*φ(n) //这条定理基友面试时还遇到了= = 欧拉函数的值φ(n)=n*(1-p[1])* ...

  6. HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化

    分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...

  7. 【省选十连测之九】【DP】【组合计数去重】【欧拉函数】基本题

    目录 题意: 输入格式: 输出格式: 数据范围: 思路: 嵌套题的转移 基本题的转移 Part1 Part2 Part3 代码 题意: 这是一个关于括号组合的题. 首先定义一道题是由'(',')',' ...

  8. [Sdoi2010]古代猪文 (卢卡斯定理,欧拉函数)

    哇,这道题真的好好,让我这个菜鸡充分体会到卢卡斯和欧拉函数的强大! 先把题意抽象出来!就是计算这个东西. p=999911659是素数,p-1=2*3*4679*35617 所以:这样只要求出然后再快 ...

  9. 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】

    P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...

随机推荐

  1. 基于HTML5 Canvas 实现地铁站监控

    伴随国内经济的高速发展,人们对安全的要求越来越高.为了防止下列情况的发生,您需要考虑安装安防系统: 提供证据与线索:很多工厂银行发生偷盗或者事故相关机关可以根据录像信息侦破案件,这个是非常重要的一个线 ...

  2. OpenVPN简单部署笔记

    打算在IDC机房部署VPN环境,Openvpn也是一个不错的选择:开源,好用,而且免费. OpenVPN简单介绍OpenVPN是一个用于创建虚拟专用网络(Virtual Private Network ...

  3. PHP输入流 php://input 相关【转】

    为什么xml_rpc服务端读取数据都是通过file_get_contents(‘php://input', ‘r').而不是从$_POST中读取,正是因为xml_rpc数据规格是xml,它的Conte ...

  4. Linux内核分析 读书笔记 (第七章)

    第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行. 2.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...

  5. Linux内核分析(第七周)

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序怎么来的? 预处理: gcc -E -o hello.cpp hello.c -m32 *负责把include的文件包含进来及宏 ...

  6. cglib 动态代理

    JDK的动态代理比较慢,可以使用cglib的代理,速度比较快: package cn.demo02; import java.lang.reflect.Method; import java.util ...

  7. “数学口袋精灵”App的第三个Sprint计划(总结与团队感悟)----开发日记

    第三阶段Sprint完成情况: 我们的"数学口袋精灵"App已经完成了,该app能随机产生多种形式的算式,比如带括号的,分数四则运算,混合运算,阶乘等,通过游戏形式让用户乐在其中. ...

  8. 20172319 《Java程序设计教程》第8周学习总结

    20172319 2018.04.24-05.03 <Java程序设计教程>第8周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  9. IP工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletReques ...

  10. HTML 5 placeHolder

    <html> <body> <input type="text" id="idNum" placeholder="pla ...