P4780 Phi的反函数

Phi(\(\varphi\) )定义

\(\varphi(n)\) 代表从1-n所有与n互质的数的个数

求\(\varphi(n)\)

普通求法:

首先将n唯一分解为

\(n=x_1^{p_1}*x_2^{p_2}……*x_n^{p_n}\)

\(\varphi(n)=n*(1-\frac1{x_1})*(1-\frac1{x_2})*……*(1-\frac1{x_n})\)

证明:

首先我们考虑在所有数中有\(\frac{1}{x}\)的概率会取到一个数是x的倍数,那么有\((1-\frac{1}{x})\)的概率会取到一个数不是x的倍数,1-n有n个数,我们要找到1-n所有与n互质的数,也就是去一个不是n的任意一个因数(x1,x2,x3……xn)的倍数,就得到以上式子

两个定理:

\[1.\begin{cases}
\varphi(nm)=\varphi(n)*\varphi(m)~~~~~gcd(n,m)=1\\
\varphi(nm)=\varphi(n)*m~~~~~~~~~~~gcd(n,m)=m
\end{cases}
\]

定理1证明:

1.在gcd(n,m)=1情况下

根据上述式子可以推导:

\(n=x_1^{p_1}*x_2^{p_2}……*x_n^{p_n}\)

\(m=y_1^{q_1}*y_2^{q_2}……*y_n^{q_n}\)

\(n*m=x_1^{p_1}*x_2^{p_2}……*x_n^{p_n}*y_1^{q_1}*y_2^{q_2}……*y_n^{q_n}\)

\(\varphi(nm)=n*m*(1-\frac1{x_1})……*(1-\frac1{x_n})*(1-\frac1{y_1})……*(1-\frac1{y_n})=\varphi(n)*\varphi(m)~~~~~~~~~~~~gcd(n,m)=m\)

2.在gcd(n,m)=m情况下

考虑感性理解,1-n里面有\(\varphi(n)\)个与n互质,那么扩大m倍,相当于有m个1-n就直接乘(因为我们保证了\(gcd(n,m)=m\)也就是n是m的倍数,所以不存在乘上m后多出了不属于n的因子)

定理2.\(\varphi(n)=n-1~~~~~~~~~~~~~n\in prim\)(这显而易见)

我们需要求Phi的反函数就要先深刻理解上述内容然后进行运用

可以根据上述定理1得到:

(在这里我们用到了定理一第一类和定理一第二类的一种特殊情况\(\varphi(n*n)=\varphi(n)*n\))

得出\(\varphi(x)=\varphi(a_1)*a_1^{p_1-1}*\varphi(a_2)*a_2^{p_2-1}*......\varphi(a_n)*a_n^{p_n-1}~~~~~~~~~~~~~~~~~~a_i\in prime\)

由定理二得:\(a_i\)都是质数,所以\(\varphi(a_i)=a_i-1\)

所有质数分解出来不超过10个,因为\(2*3*5*7*11*13*17*19*23*29=6469693230\)

\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2^{31}=2147483648\)

所以可以直接暴力搜索

(关于判断是否为质数的函数)

因为数据范围在2^{31} ,如果我们求2^{31} 范围内的质数,直接爆炸,

其实我们只需要找出2^{16}的质数,每次判断一下当前这个数now+1(也就是\(revphi(now)\))是不是质数

例如\(\varphi(x)=n=\varphi(3)*varphi(1e9+7)\)

第一次找到\(\varphi(3)\)处理以后,由于我们只找了2^{16}的质数,我们找不到\(\varphi(1e9+7)\)在里面,我们需要每次判断当前这是数是不是质数。

具体的:

第一次判断\(\varphi(3)*varphi(1e9+7)\)显然不是质数

除以\(\varphi(3)\)后变成了\(\varphi(1e9+7)\) 也就是now=1e9+6

第二次判断\((now+1)\in prime\) 那么直接把质数给除了,直接结束了AWA

那么怎么得出答案呢

\[1.\begin{cases}
\varphi(nm)=\varphi(n)*\varphi(m)~~~~~gcd(n,m)=1\\
\varphi(nm)=\varphi(n)*m~~~~~~~~~~~gcd(n,m)=m
\end{cases}
\]

\(\varphi(x)=\varphi(a_1)*a_1^{p_1-1}*\varphi(a_2)*a_2^{p_2-1}*......\varphi(a_n)*a_n^{p_n-1}~~~~~~~~~~~~~~~~~~a_i\in prime\)

我们再来重新看看这些式子

可以看出最后的\(ans=a_1*a_1^{p_1-1}*a_2*a_2^{p_2-1}*......*a_n*a_n^{p_n-1}\)

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e7+10;
int vis[N],s[30],tot=0,n,cnt=0;
ll ans=1e17+10,prim[N];
void shai(int x){
for(int i=2;i<=x;i++){
if(!vis[i]){
prim[++tot]=i;
}
for(int j=1;j<=tot&&i*prim[j]<=x;j++){
vis[prim[j]*i]=1;
if(!i%prim[j]){
break;
}
}
}
}//质数筛
bool is_p(ll x){
for(int i=2;i*i<=x;i++){
if(x%i==0){
//cout<<x<<i<<endl;
return 0;
}
}
return 1;
}//判断是否为质数
void dfs(int now,int id,ll rev){//id代表当前干过的质数,是个优化
if(now>=ans) return ;//简单优化
if(now==1){
ans=min(rev,ans);
return ;
}
if(is_p(now+1)) dfs(1,id+1,rev*(now+1));
for(int i=id;i<=tot;i++){
if(now%(prim[i]-1)==0){
int a=now;
ll b=rev;
a/=(prim[i]-1);b*=prim[i]; //定理1的情况1
dfs(a,i+1,b);
while(a%prim[i]==0){//定理1的情况2
a/=prim[i];b*=prim[i];
dfs(a,i,b);
}
}
}
} int main(){
scanf("%d",&n);
shai(sqrt(n)+1);
dfs(n,1,1);
if(ans==1e17+10){//无解或者太大了
printf("-1");
}else printf("%lld",ans);
return 0;
}

Phi的反函数的更多相关文章

  1. 【BZOJ-3643】Phi的反函数 数论 + 搜索

    3643: Phi的反函数 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 141  Solved: 96[Submit][Status][Discuss ...

  2. bzoj3643 Phi的反函数

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3643 [题解] n = p1^a1*p2^a2*...*pm^am phi(n) = p1( ...

  3. 【BZOJ 3642】Phi的反函数

    http://www.lydsy.com/JudgeOnline/problem.php?id=3643 因为\[\varphi(n)=\prod_i p_i^{k_i-1}(p_i-1),n=\pr ...

  4. [BZOJ]3643 Phi的反函数

    我承认开这篇文章只是因为好笑…… 估计Zky神看见3737会很郁闷吧. http://www.lydsy.com/JudgeOnline/problem.php?id=3643 本来想直接交3737改 ...

  5. 【BZOJ 3643】Phi的反函数 数搜索

    这道题是典型的数搜索,讲究把数一层一层化小,而且还有最重要的大质数剪枝. #include <cstdio> #include <cmath> typedef long lon ...

  6. bzoj 3643Phi的反函数

    3643: Phi的反函数 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 298  Solved: 192[Submit][Status][Discus ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. bzoj题目分类

    转载于http://blog.csdn.net/creationaugust/article/details/513876231000:A+B 1001:平面图最小割,转对偶图最短路 1002:矩阵树 ...

  9. LLVM 笔记(二)—— PHI node

    ilocker:关注 Android 安全(新手) QQ: 2597294287 什么是 PHI node? 所有 LLVM 指令都使用 SSA (Static Single Assignment,静 ...

  10. LLVM 笔记(一)—— phi 指令

    ilocker:关注 Android 安全(新手) QQ: 2597294287 语法: <result> = phi <ty> [ <val0>, <lab ...

随机推荐

  1. Atcoder beginner contest 249 C-Just K(二进制枚举)

    题目大意:给你N个字符串,你可以从中选择任意数量的字符串,请统计在你的字串中,相同字母出现次数正好为K次的字母数.数据保证出现的字母都是小写字母. 1≤N≤15 1 ≤K≤N 一开始读题的时候读错了, ...

  2. Fibonacci数列 与 杨辉三角

    Fibonacci数列:除第一个与第二个数之外,其余数均由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 通过生成器,程序如下: def fib(max): m ...

  3. ArchLinux安装手册(2022-10-01)

    准备工作 镜像下载:北京外国语大学镜像 使用ventoy做启动盘: (1) ventoy下载:github下载地址 (2) 解压运行下载好的ventoy,设备选择准备好的U盘(会清空),然后选择安装即 ...

  4. redis位图(bitmap)常用命令的解析

    描述   bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到.登录等场景 常用命令及解析 常用命令 setbit key offset va ...

  5. Optional对象

    Optional对象 Optional 类是一个可以为null的容器对象,用于简化Java中对空值的判断处理,以防止出现各种空指针异常. 静态方法-of 必须确定对象不为null 在使用of封装成op ...

  6. 渗透测试中遇到的Adminer任意文件读取漏洞

    渗透测试中遇到的Adminer任意文件读取漏洞 免责声明: 软件简介 漏洞原理 漏洞复现 字典脚本 直接输入文件读取脚本 直接输入文件绝对路径读取脚本使用方法 字典脚本使用方法 免责声明: 免责声明: ...

  7. 2022春每日一题:Day 34

    题目:lowbit求和 (没有找到哪个公开题库有这个题) 题意:求数组中任意一对数的异或和的lowbit的总和. 对于异或,二进制位中两个数相等则为0,反之为1,而且此题是要求lowbit,那我们利用 ...

  8. 165 pbi-utils 使用文档

    165 pbi-utils 使用文档 一.背景 先来说一下为什么会有 pbi-utils 这个小工具吧.在我日常做演示的示例文件的时候,每次都要重新搞一次 Power BI Desktop,就想能不能 ...

  9. linux启动终端出现To run a command as administrator (user root) use sudo command See man sudo_root

    解决方法 touch ~/.sudo_as_admin_successful

  10. MyEclipse 中自动安插作者、注释日期等快捷键方法

    MyEclipse 中自动插入作者.注释日期等快捷键方法 MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Jav ...