素数环
来源:互联网 发布:北京建筑大学网络 编辑:程序博客网 时间:2024/05/16 10:05
题目描述
中文题目就不给大家写故事背景了。给你1~n这n(0<n<19)个整数,让你把他们放在一个环上,使环上相邻的两个数的和为素数。对于一个整数n一共有多种方式构成这种素数环,把一共有多少方式输出,每种方式都有1开头。
例如:
n等于的时候,把1~6放在一个环
上面这个环就满足要求,1+4=5,5为素数。4+3=7,7为素数……6+1=7,7为素数。
输入样例:
6
输出样例:
2
解释:当n等于6的时候一共有
1 4 3 2 5 6
1 6 5 2 3 4
上面这2种方式
输入样例:
8
输出样例:
4
解释:当n等于8的时候一共有
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
上面这4种方式构成素数环。
可以使用递归实现
#include <stdio.h>#include <math.h>#include <string.h>int len;int ans;int prime[12] = {2,3,5,7,11,13,17,19,23,29,31,37};int isprime[40];void primering(int ring[], int f[], int n){ if (n == len) { if (isprime[ring[n]+1] == 1) ans++; return; } int i; for (i = 2; i <= len; ++i) { if (isprime[ring[n]+i] == 1 && f[i] == 0) { f[i] = 1; ring[n+1] = i; primering(ring, f, n+1); f[i] = 0; } } return;}int main(){ ans = 0; scanf("%d", &len); int i, j; int f[30] = {0}; int ring[30]; if (len == 1 || len == 2) ans = 1; else if (len % 2 == 1) ans = 0; else { memset(isprime, 0, sizeof(isprime)); for (j = 0; j < 12; ++j) isprime[prime[j]] = 1; ring[1] = 1; for (i = 2; i <= len; ++i) { if (isprime[i+1] == 1 && f[i] == 0) { f[i] = 1; ring[2] = i; primering(ring, f, 2); f[i] = 0; } } } printf("%d\n", ans); return 0;}
0 0
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- 素数环
- [单调队列DP] HDU3401 Trade
- C#中的代码书写规范以及命名规范
- Bellman-Ford算法模板
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
- 南阳题目364-田忌赛马
- 素数环
- CF 236A boy or girl
- 对HashMap中的值进行排序
- 【SDOI2014】数数
- px 与 dp, sp换算公式?
- Android-view自定义-Canvas
- 2019
- Linux 网络设备驱动开发(二) —— Linux 网络栈剖析
- 屏蔽Home键