P4780-Phi的反函数【dfs】
生活随笔
收集整理的這篇文章主要介紹了
P4780-Phi的反函数【dfs】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P4780
題目大意
給出nnn,求一個最小的xxx滿足φ(x)=n\varphi(x)=nφ(x)=n。
若不存在或者大于2312^{31}231則輸出?1-1?1。
1≤n≤2311\leq n\leq 2^{31}1≤n≤231
解題思路
考慮用φ\varphiφ比較常用的公式,把nnn拆成若干個∏(pi?1)?pici\prod (p_i-1)*p_i^{c_i}∏(pi??1)?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】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod1676-无向图同构【乱搞】
- 下一篇: LG电子预计OLED电视今年出货量将同比