UVa 10837 (欧拉函数 搜索) A Research Problem
2015-02-24 14:56
309 查看
发现自己搜索真的很弱,也许做题太少了吧。代码大部分是参考别人的,=_=||
题意:
给出一个phi(n),求最小的n
分析:
回顾一下欧拉函数的公式:
代码君
题意:
给出一个phi(n),求最小的n
分析:
回顾一下欧拉函数的公式:
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10000; const int INF = 200000000; int phi_n, ans; bool vis[maxn + 10]; int prime[1500], pcnt = 0; int fac[1500], tot; void prime_table() { int m = sqrt(maxn + 0.5); for(int i = 2; i <= m; i++) if(!vis[i]) for(int j = i * i; j <= maxn; j += i) vis[j] = true; for(int i = 2; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i; } void factor(int n) { tot = 0; for(int i = 0; i < pcnt && (prime[i]-1) * (prime[i]-1) <= n; i++) if(n % (prime[i] - 1) == 0) fac[tot++] = prime[i]; } int judge(int n) { if(n == 1) return 1; n++; //判断剩余的phin中加1后是否为素数 for(int i = 0; i < pcnt && prime[i] * prime[i] <= n; i++) if(n % prime[i] == 0) return -1; //如果为素数的话,判断是否标记过 for(int i = 0; i < tot; i++) if(vis[i] && n == fac[i]) return -1; return n; } void dfs(int n, int phin, int d) { if(d == tot) { int t = judge(phin); if(t > 0) ans = min(ans, n * t); return; } dfs(n, phin, d+1); if(phin % (fac[d] - 1) == 0) { vis[d] = true; n *= fac[d]; phin /= (fac[d] - 1); for(;;) { dfs(n, phin, d+1); if(phin % fac[d] != 0) return; phin /= fac[d]; n *= fac[d]; } } vis[d] = false; } int main() { freopen("in.txt", "r", stdin); int kase = 0; prime_table(); while(scanf("%d", &phi_n) == 1 && phi_n) { ans = INF; memset(vis, false, sizeof(vis)); factor(phi_n); dfs(1, phi_n, 0); printf("Case %d: %d %d\n", ++kase, phi_n, ans); } return 0; }
代码君
相关文章推荐
- A Research Problem UVA - 10837 欧拉函数+暴力 好题
- uva 10837 - A Research Problem(欧拉函数+暴力)
- uva 10837 A Research problem 欧拉函数+暴力
- UVa 10837 A Research Problem 欧拉函数
- UVA 10837 - A Research Problem(欧拉函数)
- A Research Problem UVA - 10837
- uva 10837 - A Research Problem(欧拉功能+暴力)
- UVA 10837(p345)----A Research Problem
- UVA 10837 A Research Problem
- uva10837 A Research Problem
- uva 10047 Problem A: The Monocycle (搜索:BFS+优先队列)
- UVA - 810 (A Dice problem 搜索)
- 紫书搜索 例题7-4 UVA - 524 Prime Ring Problem
- UVa 10837 A Research Problem 欧拉函数
- UVa Problem 10202 Pairsumonious Numbers (两两之和)
- UVA 12493 Stars(扩展欧几里德+欧拉函数)
- 搜索—Problem_1013&1014-A strange lift
- UVa Problem 10254 The Priest Mathematician (牧师数学家)
- SCUT第四次训练赛(归并排序 sort 搜索 搜索2 并查集 高精度乘法 二分 Dating with girls(1) 均分纸牌 导弹拦截 A + B Problem II)
- UVa Problem 10089 Repackaging (重新打包)