欧拉函数:

  φ(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. 【下一代核心技术DevOps】:(四)私有镜像库阿里云Docker服务使用

    1.使用阿里云镜像库有很多优点 稳定可靠,阿里技术,放心使用. 国内cdn多节点加速,下载速度非常快 可以和阿里云Git代码集成,不需要第三方CI工具,当然带的自动构建服务也可以和其他的Git库集成, ...

  2. MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录

    MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...

  3. Python-复习-习题-13

    复习 dict: dic = {'name':'alex'}增:dic['age'] = 21 存在就覆盖dic.setdefault() 存在什么也不做,没有就增加 删除:pop()按照key删除, ...

  4. Linux大棚命令记录

    查看系统支持的shell: cat  /etc/shells 查看当前系统用的shell: echo $SHELL 从bash切换到zsh: 先yum安装,然后 chsh -s /bin/zsh ,退 ...

  5. Echo团队便利记事本项目终审报告

    一.团队成员简介 http://www.cnblogs.com/echo-buaa/p/3991968.html 二.团队项目的目标,预期的典型用户,预期的功能描述,预期的用户数量在哪里? 项目的目标 ...

  6. 【CV】ICCV2015_Unsupervised Learning of Visual Representations using Videos

    Unsupervised Learning of Visual Representations using Videos Note here: it's a learning note on Prof ...

  7. BugPhobia开发终结篇章:Beta阶段第XI次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第十一次Scrum Meeting 敏捷开发起始时间 2015/01/06 00:00 A.M. 敏捷开发终止时间 2016/01/10 0 ...

  8. Linux内核及分析 第四周 扒开系统调用的三层皮(上)

    实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...

  9. 20135316Linux内核学习笔记第八周

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程调度与进程调度的时机分析 ...

  10. Daily Scrum 12-25

    Meeting Minutes 针对设计师提出的问题完成了layout的微调: 讨论alpha测试反馈反映出的一些问题: 完成了代码的merge(与bing词典 1.5版本): Progress   ...