URAL - 1356
2017-09-06 14:00
316 查看
哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和,任一大于7的奇数都可写成三个质数之和的猜想
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1397
题目大意:给出一个数n,把他分解成两个素数的和,求方案数
解题思路:暴力
AC代码:
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1356
题目大意:给出一个数,如果本身是素数,输出本身。如果不是素数,如果能由两个素数相加构成,输出这两个素数,如果能由三个素数构成,输出这3个素数。
解题思路:对于n,如果n是偶数且大于等于4,那么他一定能表示成两个素数的和,如果n是奇数,如果他由两个素数相加构成,那么其中一个素数一定是2,假设不是2,那么任意两个奇数相加一定是偶数,矛盾(素数除了2,其他都是奇数),如果他由3个数相加构成,假设其中一个数是2,那么减去2之后还是奇数且还是合数,那么一定是由2和另一个素数相加构成。如果构成的数中不存在2,暴力判断。
AC代码:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1397
题目大意:给出一个数n,把他分解成两个素数的和,求方案数
解题思路:暴力
AC代码:
#include<cstdio> using namespace std; const int MAXN = (1 << 15) + 5; int prime[MAXN], tot = 0; bool vis[MAXN]; void toInit() { for (int i = 2;i < MAXN;++i) { if (!vis[i]) prime[tot++] = i; for (int j = 0;j < tot&&i*prime[j] < MAXN;++j) { vis[i*prime[j]] = 1; if (i%prime[j] == 0) break; } } } int main() { toInit(); for (int n;scanf("%d", &n) == 1 && n;) { int ans = 0; for (int i = 0;prime[i] <= n / 2 && i < tot;++i) if (!vis[n - prime[i]]) ans++; printf("%d\n", ans); } return 0; }
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1356
题目大意:给出一个数,如果本身是素数,输出本身。如果不是素数,如果能由两个素数相加构成,输出这两个素数,如果能由三个素数构成,输出这3个素数。
解题思路:对于n,如果n是偶数且大于等于4,那么他一定能表示成两个素数的和,如果n是奇数,如果他由两个素数相加构成,那么其中一个素数一定是2,假设不是2,那么任意两个奇数相加一定是偶数,矛盾(素数除了2,其他都是奇数),如果他由3个数相加构成,假设其中一个数是2,那么减去2之后还是奇数且还是合数,那么一定是由2和另一个素数相加构成。如果构成的数中不存在2,暴力判断。
AC代码:
#include<cstdio> using namespace std; bool isPrime(int n)//6素数判断法 { if (n <= 3) return n > 1; if (n % 2 == 0 || n % 3 == 0) return false; for (int i = 5;i*i <= n;i += 6) if (n%i == 0 || n % (i + 2) == 0) return false; return true; } void toCal(int n) { if (n == 1 || isPrime(n)) printf("%d\n", n); else { if (isPrime(n - 2)) printf("%d %d\n", 2, n - 2); else { if (n % 2 == 0) { for (int i = 3;i * 2 <= n;i += 2)//i表示最小的一个 if (isPrime(i) && isPrime(n - i)) { printf("%d %d\n", i, n - i); return; } } else { if (isPrime(n - 4)) printf("%d %d %d\n", 2, 2, n - 4); else { for (int i = 3;i * 3 <= n;i += 2)//i表示最小的一个 for (int j = i;j * 2 <= n - i;j += 2) if (isPrime(i) && isPrime(j) && isPrime(n - i - j)) { printf("%d %d %d\n", i, j, n - i - j); return; } } } } } } int main() { int t;scanf("%d", &t); while (t--) { int n;scanf("%d", &n); toCal(n); } return 0; }
相关文章推荐
- URAL 1356
- 数论 ural 1356. Something Easier
- URAL 1356 哥德巴赫猜想
- URAL 1356. Something Easier(哥德巴赫猜想)
- URAL1356(数论)
- ural 1356. Something Easier(数论,哥德巴赫猜想)
- URAL 1079. Maximum
- dp + dfs 状态保存(重点) hdu 1074 sdut 1356
- Ural 1018
- ural 1023 Buttons
- ural 1048 Superlong Sums
- URAL 1009. K-based Numbers
- ural 1056. Computer Net
- ural 1225. Flags
- ural 1306【priority_queue+堆查找中间值】
- 【树状DP】ural 1018
- ural 1004(floyd 求最小环)
- Ural_1017. Staircases(DP)
- Ural_1060. Flip Game(bfs + 位压缩)
- Ural_1100. Final Standings(stable_sort)