BJOI2014 Euler 一道简单的数论暴力
来源:互联网 发布:九索数据怎么样 编辑:程序博客网 时间:2024/06/01 10:48
题目大意
给你一个数
解题思路
求
由等式一可知,因为
程序
#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 7e3;typedef long long LL;LL N, Ans, Fac[MAXN], Pri[MAXN];int tot, cnt;void Prepare(LL N) { for (LL i = 1; i * i < N; i ++) { if (N % i != 0) continue; Fac[++ tot] = i; if (1ll * i * i == N) continue; Fac[++ tot] = N / i; }}bool IsPrime(LL Now) { for (LL i = 2; i * i <= Now; i ++) if (Now % i == 0) return 0; return 1;}void GetPri() { for (int i = 1; i <= tot; i ++) if (IsPrime(Fac[i] + 1)) Pri[++ cnt] = Fac[i] + 1;}bool cmp(LL a, LL b) { return a > b;}bool Check(LL Num, LL Now) { if (Now == 1) return 1; if (Now % Pri[Num] == 0) return Check(Num, Now / Pri[Num]); return 0;}void Dfs(int Num, LL Now, LL S) { if (Num > cnt || S > Ans || Now == 1) return; if (Now % (Pri[Num] - 1) != 0) { Dfs(Num + 1, Now, S); return; } if (Now % (Pri[Num] - 1) == 0 && Check(Num, Now / (Pri[Num] - 1))) Ans = min(Ans, S / (Pri[Num] - 1) * Pri[Num]); LL Ord = (Pri[Num] - 1); for (; Now % Ord == 0; Ord *= Pri[Num]) Dfs(Num + 1, Now / Ord, S / (Pri[Num] - 1) * Pri[Num]); Dfs(Num + 1, Now, S);}void Solve(LL N) { Ans = (N == 1) ? N : N * 10; tot = cnt = 0; Prepare(N); GetPri(); sort(Pri + 1, Pri + 1 + cnt, cmp); Dfs(1, N, N);}int main () { int Test; scanf("%d", &Test); for (; Test; Test --) { scanf("%lld", &N); Solve(N); printf("%lld\n", Ans); }}
2 0
- BJOI2014 Euler 一道简单的数论暴力
- 【BJOI2014】Euler
- 【jzoj3760】【BJOI2014】【Euler】
- Project euler 401 约数的平方和 (数论)
- NBUT [1647] 又一道简单题【暴力】
- [jzoj]3760. 【BJOI2014】Euler(欧拉函数)
- 一道水题---lucas的数论
- 一道初等平面几何竞赛题的暴力解法
- HDU1013-简单的数论
- 数论简单的题目
- 简单的数论
- 简单的数论2
- 数论:简单的模板
- NBUT - 1647 又一道简单题 (暴力模拟)
- 简单的暴力搜索
- 简单的暴力搜索
- 一道简单的题目
- 一道简单的题
- 移动APP的开发需求分析
- Java代码性能优化6个原则
- 【CodeForces】[656A]Da Vinci Powers
- Myeclipse添加反编译JadClipse插件
- 巨匠
- BJOI2014 Euler 一道简单的数论暴力
- 桌面清小控件之清理进程
- PHP Session和Cookie,Session阻塞,Session垃圾回收
- 常用的UI控件(android)
- nmon性能监控工具
- 代码质量
- 二分查找
- eclipse调试crypti
- C++作业3