用C语言编写#include <iostream> #include <algorithm> #include <vector> #include <cmath> using namespace std; const int N = 1000000+10; int a[N]; int path[N]; bool vis[N]; int n,k; vector<int> A; bool judge(int n) { if(n == 1)return false; for(int i = 2;i <= sqrt(n);i ++ ) { if(n % i == 0)return false; } return true; } void dfs(int u) { if(u == k) { int sum = 0; for(int i = 0;i < k;i ++ )sum += path[i]; if(judge(sum))A.push_back(sum); return; } for(int i = 1;i <= n;i ++ ) { if(!vis[i]) { vis[i] = 1; path[u] = a[i]; dfs(u + 1); vis[i] = 0; } } } int main() { cin >> n >> k; for(int i = 1;i <= n;i ++ )cin >> a[i]; dfs(0); sort(A.begin(),A.end()); A.erase(unique(A.begin(),A.end()),A.end()); cout << A.size(); return 0; }
时间: 2024-03-10 19:44:22 浏览: 128
这段代码实现了一个数列的题目,其中给出了一个长度为 $n$ 的数列 $a_{1},a_{2},...,a_{n}$,要求从其中选出 $k$ 个数,使得它们的和是质数的方案数。
以下是使用 C 语言语法重写的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#define N 1000010
int a[N], path[N];
bool vis[N];
int n, k;
int A[N], cnt = 0;
bool judge(int n) {
if (n == 1) return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
void dfs(int u) {
if (u == k) {
int sum = 0;
for (int i = 0; i < k; i++) sum += path[i];
if (judge(sum)) A[cnt++] = sum;
return;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
vis[i] = true;
path[u] = a[i];
dfs(u + 1);
vis[i] = false;
}
}
}
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
dfs(0);
qsort(A, cnt, sizeof(int), cmp);
int ans = 0;
for (int i = 0; i < cnt; i++) {
if (i == 0 || A[i] != A[i - 1]) ans++;
}
printf("%d\n", ans);
return 0;
}
```
该代码使用深度优先搜索的方式枚举选取的数的组合,并计算它们的和。如果和是质数,则将其加入到一个动态数组 `A` 中。最后,对 `A` 数组进行排序和去重,统计不同的和的个数。
阅读全文