【BZOJ 3643】Phi的反函数 数搜索
2024-10-21 16:12:41
这道题是典型的数搜索,讲究把数一层一层化小,而且还有最重要的大质数剪枝。
#include <cstdio>
#include <cmath>
typedef long long LL;
int n;
const int N=;
const LL Inf=0x7fffffff;
LL ans;
int len,prime[N];
bool isnot[N];
inline void getprime(){
int lim=;
for(int i=;i<=lim;i++){
if(!isnot[i])prime[++len]=i;
for(int j=;prime[j]*i<=lim;j++){
isnot[prime[j]*i]=;
if(i%prime[j]==)break;
}
}
}
inline bool isprime(int x){
if(x==)return ;
int lim=(int)sqrt(x+0.5);
for(int i=;prime[i]<=lim;i++)
if(x%prime[i]==)
return ;
return ;
}
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==){ans=now;return;}
if(isprime(rest+)){ans=Min(ans,now*(rest+));return;}
LL have=prime[pos]-,j=prime[pos];
if(pos==)have<<=,j<<=;
while(rest%have==)
dfs(pos+,now*j,rest/have),have*=prime[pos],j*=prime[pos];
dfs(pos+,now,rest);
}
int main(){
getprime(),scanf("%d",&n),ans=Inf+;
if(n<=){printf("-1");return ;}
if(n==){printf("");return ;}
dfs(,,n);
printf("%lld",ans==Inf+?-:ans);
}
最新文章
- 烂泥:学习mysql数据库主从同步复制原理
- 资源监控工具Spotlight-使用说明
- 字符串与json之间的相互转化
- laravel paginate动态分页
- math对象和date对象
- CF 253B Two Heaps
- JavaScript获取两个时间的时间差
- A const field of a reference type other than string can only be initialized with null Error [duplicate]
- C语言中的宏总结
- <;input>; 标签
- Session中超时时长设置
- 【转】关于“ORA-01653: 表 SYS.AUD$ 无法通过 128 (在表空间 SYSTEM 中) 扩展”的错误
- Android中使用findViewByMe提升组件查找效率
- Canvas 实现灵动的红鲤鱼动画(上)
- React和Vue的组件更新比较
- python的小基础
- UINavigationController 返回手势与 leftBarButtonItem
- 【BZOJ3140】消毒(二分图匹配)
- 【转载】Jenkins安装以及邮件配置
- java的几个奇怪语法