欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

P4780-Phi的反函数【dfs】

发布时间:2023/12/3 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 P4780-Phi的反函数【dfs】 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

正题

题目链接:https://www.luogu.com.cn/problem/P4780


题目大意

给出nnn,求一个最小的xxx满足φ(x)=n\varphi(x)=nφ(x)=n
若不存在或者大于2312^{31}231则输出−1-11

1≤n≤2311\leq n\leq 2^{31}1n231


解题思路

考虑用φ\varphiφ比较常用的公式,把nnn拆成若干个∏(pi−1)∗pici\prod (p_i-1)*p_i^{c_i}(pi1)pici的形式。因为这个不会超过logloglog个所以可以暴力搜索比较小的质数,然后直到nnn剩下一个pi+1p_i+1pi+1时或111时再暴力判断。


code

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; const ll N=46360; ll n,ans,cnt,pri[N/10]; bool v[N]; void Prime(){for(ll i=2;i<N;i++){if(!v[i])v[i]=1,pri[++cnt]=i;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break; }}return; } bool IsPri(ll x){if(x%2==0)return 0;for(ll i=3;i*i<=x;i+=2)if(x%i==0)return 0;return 1; } void dfs(ll phi,ll x,ll k){if(phi>(1ll<<31))return;if(x==1){ans=min(ans,phi);return;}if(x>sqrt(n)&&IsPri(x+1))ans=min(ans,phi*(x+1));if(pri[k]>x)return;for(ll i=k;i<=cnt;i++){if(x%(pri[i]-1)==0){ll z=x/(pri[i]-1),p=phi*pri[i];dfs(p,z,i+1); while(z%pri[i]==0){p*=pri[i];z/=pri[i];dfs(p,z,i+1);}}}return; } signed main() {scanf("%lld",&n);Prime();ans=(1ll<<32);dfs(1,n,1);if(ans==(1ll<<32))puts("-1");else printf("%lld\n",ans);return 0; }

总结

以上是生活随笔为你收集整理的P4780-Phi的反函数【dfs】的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。