逆元&欧拉函数
欧拉函数:
φ(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 ;
}
范围内阶乘的逆元
逆元&欧拉函数的更多相关文章
- BZOJ 2186 沙拉公主的困惑(预处理逆元+欧拉函数)
题意:求1-n!里与m!互质的数有多少?(m<=n<=1e6). 因为n!%m!=0,所以题目实际上求的是phi(m!)*n!/m!. 预处理出这些素数的逆元和阶乘的模即可. # incl ...
- BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 755 Solved: 432[Submit][Status][Discuss] ...
- 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, ...
- POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
Burnside引理经典好题呀! 题解参考 https://blog.csdn.net/maxwei_wzj/article/details/73024349#commentBox 这位大佬的. 这题 ...
- BZOJ2186 欧拉函数
欧拉函数:一般记作φ(n),表示1-n中与n互质的数的数量. 欧拉函数是积性函数,即φ(m*n)=φ(m)*φ(n) //这条定理基友面试时还遇到了= = 欧拉函数的值φ(n)=n*(1-p[1])* ...
- HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化
分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...
- 【省选十连测之九】【DP】【组合计数去重】【欧拉函数】基本题
目录 题意: 输入格式: 输出格式: 数据范围: 思路: 嵌套题的转移 基本题的转移 Part1 Part2 Part3 代码 题意: 这是一个关于括号组合的题. 首先定义一道题是由'(',')',' ...
- [Sdoi2010]古代猪文 (卢卡斯定理,欧拉函数)
哇,这道题真的好好,让我这个菜鸡充分体会到卢卡斯和欧拉函数的强大! 先把题意抽象出来!就是计算这个东西. p=999911659是素数,p-1=2*3*4679*35617 所以:这样只要求出然后再快 ...
- 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】
P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...
随机推荐
- 【下一代核心技术DevOps】:(四)私有镜像库阿里云Docker服务使用
1.使用阿里云镜像库有很多优点 稳定可靠,阿里技术,放心使用. 国内cdn多节点加速,下载速度非常快 可以和阿里云Git代码集成,不需要第三方CI工具,当然带的自动构建服务也可以和其他的Git库集成, ...
- MongoDB副本集(一主一备+仲裁)环境部署-运维操作记录
MongoDB复制集是一个带有故障转移的主从集群.是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复.MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一 ...
- Python-复习-习题-13
复习 dict: dic = {'name':'alex'}增:dic['age'] = 21 存在就覆盖dic.setdefault() 存在什么也不做,没有就增加 删除:pop()按照key删除, ...
- Linux大棚命令记录
查看系统支持的shell: cat /etc/shells 查看当前系统用的shell: echo $SHELL 从bash切换到zsh: 先yum安装,然后 chsh -s /bin/zsh ,退 ...
- Echo团队便利记事本项目终审报告
一.团队成员简介 http://www.cnblogs.com/echo-buaa/p/3991968.html 二.团队项目的目标,预期的典型用户,预期的功能描述,预期的用户数量在哪里? 项目的目标 ...
- 【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 ...
- BugPhobia开发终结篇章:Beta阶段第XI次Scrum Meeting
0x01 :Scrum Meeting基本摘要 Beta阶段第十一次Scrum Meeting 敏捷开发起始时间 2015/01/06 00:00 A.M. 敏捷开发终止时间 2016/01/10 0 ...
- Linux内核及分析 第四周 扒开系统调用的三层皮(上)
实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...
- 20135316Linux内核学习笔记第八周
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程调度与进程调度的时机分析 ...
- Daily Scrum 12-25
Meeting Minutes 针对设计师提出的问题完成了layout的微调: 讨论alpha测试反馈反映出的一些问题: 完成了代码的merge(与bing词典 1.5版本): Progress ...