欧拉函数:

  φ(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. Lustre文件系统部署和应用探索

    1. Lustre文件系统概述 2. Lustre文件系统部署 2.1 基本环境 本篇博客将在KVM虚拟机中部署Lustre文件系统. 操作系统版本为CentOS6.5_x86_64.Lustre软件 ...

  2. kvm虚拟化关闭虚拟网卡virbr0的方法

    我们知道:kvm虚拟化环境安装好后,ifconfig会发现多了一个虚拟网卡virbr0这是由于安装和启用了libvirt服务后生成的,libvirt在服务器(host)上生成一个 virtual ne ...

  3. B. Views Matter

    链接 [http://codeforces.com/contest/1061/problem/B] 题意 问你最多去掉多少块使得从上和右看,投影图不变 分析 注意细节,尤其第一列 代码 #includ ...

  4. 软件工程M1/M2总结

    也不分M1/M2了,就从头到尾的梳理一下这学期的软工课吧. 第一节课,老师就稀里哗啦说了一下这学期要怎么搞,什么个人项目啦,结对项目啦,团队项目一二啦,还要组队啊什么的,然后风风火火的组队. 个人项目 ...

  5. 【Beta阶段】M2事后分析

    先上照片,最后一次开会了啊... 计划 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 答:没有全部做完,到目前为止,我们的还有几个实验的报告生成功能没有上线.这几个实验的数据处理文件已经 ...

  6. linux及安全第三周总结——跟踪分析LINUX内核的启动过程

    linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一 ...

  7. HDU 2012 素数判定

    http://acm.hdu.edu.cn/showproblem.php?pid=2012 Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括 ...

  8. 自己写的browse.bat与perl写的url_handler.pl的比较

    以前自己也写过Windows下自动打开多个浏览器测试某个URI,提高浏览器兼容性测试效率. 但是写的browse.bat文件还是最基础简陋的 @echo off if '%1'=='-c' ( sta ...

  9. apache Storm学习之二-基本概念介绍

    2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies Streams Spouts Bolts Stream groupings Reliability ...

  10. Linux初学笔记---关于进程管理等

    菜鸟初学: 1. 查看进程用的命令: ps 具体用法 ps -A ro ps -e 显示所有进程 ps -u root 显示root 用户的进程 ps -u root -N 显示非root用户的进程 ...