// P1706 全排列问题
// 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
#include <bits/stdc++.h>
inline bool isprime(int x) {
if (x == 1) return false; // 注意这步特判是必需的
for (int i = 2; i * i <= x; ++i)
if (x % i == 0)
return false;
return true;
}
const int N = 25;
int a[N], ans, n, k;
void dfs(int now, int sum, int sid) {
// 现在已经选了 now 个数,当前总和为 sum
// sid 是这次选数的起始下标,即我们从 a[sid] 开始选数枚举
if (now == k) {
if (isprime(sum))
++ans;
return ;
}
for (int i = sid; i <= n - k + now + 1; ++i)
dfs(now + 1, sum + a[i], i + 1);
return ;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
dfs(0, 0, 1);
printf("%d\n", ans);
return 0;
}
// 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
#include <bits/stdc++.h>
inline bool isprime(int x) {
if (x == 1) return false; // 注意这步特判是必需的
for (int i = 2; i * i <= x; ++i)
if (x % i == 0)
return false;
return true;
}
const int N = 25;
int a[N], ans, n, k;
void dfs(int now, int sum, int sid) {
// 现在已经选了 now 个数,当前总和为 sum
// sid 是这次选数的起始下标,即我们从 a[sid] 开始选数枚举
if (now == k) {
if (isprime(sum))
++ans;
return ;
}
for (int i = sid; i <= n - k + now + 1; ++i)
dfs(now + 1, sum + a[i], i + 1);
return ;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
dfs(0, 0, 1);
printf("%d\n", ans);
return 0;
}
全部评论
相关推荐
点赞 评论 收藏
分享
查看15道真题和解析