欧拉函数:

  φ(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. libmysqlclient.so.16: cannot open shared object file: No such file or directory

    编译安装的mysql5.6.39,安装目录是/usr/local/mysql,启用程序时报错:libmysqlclient.so.16: cannot open shared object file: ...

  2. Mysql双主热备+LVS+Keepalived高可用操作记录

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  3. Visual Studio2015安装过程以及单元测试

    安装环境: 安装版本: Visual Studio2015 安装过程: 因为我是在第一次老师安排的作业的时候感觉VC++6.0不如VS方便所以才装的Visual Studio2015,又安装了点插件, ...

  4. 基于SSH 供应链管理系统质量属性说明

    产品的易用程度如何,执行速度如何,可靠性如何,当发生异常情况时,系统如何处理.这些被称为软件质量属性,而特性是指系统非功能(也叫非行为)部分的需求. 性能:性能就是一个东西有多快,通常指响应时间或延迟 ...

  5. s标签s:if和s:set实现一个表格显示为多个表格

    1.首先本来这个表格是这样的 2.这时候代码是这样的 <table cellpadding="4"> <tr> <th>指标点</th&g ...

  6. PAT 1082 射击比赛

    https://pintia.cn/problem-sets/994805260223102976/problems/994805260990660608 本题目给出的射击比赛的规则非常简单,谁打的弹 ...

  7. HDU 2081 手机短号

    Problem Description 大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号.假设所有的短号都是是 6+手机号的后5位,比 ...

  8. Eclipse集成Tomcat报错:java.lang.OutOfMemoryError: PermGen space

    Eclipse集成Tomcat报错,使用Spring 4.3 框架,运行一段应用后,控制台报错: Unexpected death of background thread ContainerBack ...

  9. WebLogic: 内存溢出

    每次部署完项目,重启Weblogic服务,总是遇到java.lang.OutOfMemoryError: PermGen space,其实物理内存也是够的,当时的解决方法就是多重启几次Weblogic ...

  10. php的一些算法题

    1.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,请编程输出两年内每个月的兔子总数为多少? <?php function getRes ...