【BZOJ 3643】Phi的反函数 数搜索
2017-09-17 21:29
295 查看
这道题是典型的数搜索,讲究把数一层一层化小,而且还有最重要的大质数剪枝。
#include <cstdio> #include <cmath> typedef long long LL; int n; const int N=100010; const LL Inf=0x7fffffff; LL ans; int len,prime ; bool isnot ; inline void getprime(){ int lim=100000; for(int i=2;i<=lim;i++){ if(!isnot[i])prime[++len]=i; for(int j=1;prime[j]*i<=lim;j++){ isnot[prime[j]*i]=1; if(i%prime[j]==0)break; } } } inline bool isprime(int x){ if(x==1)return 0; int lim=(int)sqrt(x+0.5); for(int i=1;prime[i]<=lim;i++) if(x%prime[i]==0) return 0; return 1; } inline LL Min(LL x,LL y){ return x<y?x:y; } void dfs(int pos,LL now,int rest){ if(pos>=len)return; if(now>=ans)return; if(rest==1){ans=now;return;} if(isprime(rest+1)){ans=Min(ans,now*(rest+1));return;} LL have=prime[pos]-1,j=prime[pos]; if(pos==1)have<<=1,j<<=1; while(rest%have==0) dfs(pos+1,now*j,rest/have),have*=prime[pos],j*=prime[pos]; dfs(pos+1,now,rest); } int main(){ getprime(),scanf("%d",&n),ans=Inf+1; if(n<=0){printf("-1");return 0;} if(n==1){printf("1");return 0;} dfs(1,1,n); printf("%lld",ans==Inf+1?-1:ans); }
相关文章推荐
- BZOJ 3643|Phi的反函数|搜索|线性筛法
- BZOJ3643 Phi的反函数(数论+搜索)
- BZOJ 3643: Phi的反函数 搜索
- bzoj 3643:Phi的反函数 (数论+搜索)
- [BZOJ3643]Phi的反函数(数学相关+搜索)
- 【BZOJ-3643】Phi的反函数 数论 + 搜索
- 【NOIP 模拟题】【bzoj 3643】Phi的反函数(数论+搜索)
- 【BZOJ3643】phi的反函数,暴搜
- bzoj3643 Phi的反函数
- [BZOJ3643] phi的反函数 - 欧拉函数 - dfs
- [BZOJ3643]Phi的反函数(数论+dfs)
- BZOJ 3643 Phi的反函数
- BZOJ 3643 Phi的反函数
- BZOJ3643-欧拉函数,搜索
- 【BZOJ 3642】Phi的反函数
- bzoj3643 Phi的反函数 搜索
- [暴力搜索 剪枝 约数和反函数] BZOJ 3629 [JLOI2014]聪明的燕姿
- 【搜索好题】bzoj1501 [NOI2005]智慧珠游戏
- BZOJ 1082 SCOI 2005 栅栏 搜索+剪枝
- BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】