科林明伦杯哈尔滨理工大学第九届程序设计竞赛 H 题(dfs)
深度优先搜索!!!!!
n 个数中取不超过 k 个数并将他们相加,请问有多少种不同的取法使得取出的数的和是质数
Input多组数据,第一行一个整数 T 表示数据组数(T<=5)对于每一组数据:第一行两个整数 n,k,意义如题所示(1<=n<=20,k<=n)接下来一行 n 个正整数,保证 Ai<=5000000
Output
对于每一组数据,输出一行一个整数作为答案
Sample Input
1
4 3
3 7 12 19
sample Output
6
Hint
样例解释:{3},{7},{19},{7,12},{12,19},{3,7,19}
这个题比赛时没有 ac 比赛时一直在考虑该怎样优化暴力,最后快要结束时听大佬李用dfs过了,于是结束后补一波题,相当于重新学了一波dfs
1.首先素数打表,本题 5e6 的数据,我稳妥一点直接开到 1e7;
2.第二就是最核心的部分,dfs递归运用,题中说是不超过 k 个数,所以在dfs中要罗列 1 - k,
void dfs(ll x,ll sum,ll k)
{if(isp[sum]==0) //这里sum 为每次传进来的 a[i] 和 从a[i] 开始往后的1 - k 个数列中的数(a[i],a[i]+a[i+1],.,.,.,.,.,)ans++;if(k>=m) //递归的终止条件,题目中的不超过k次return;for(ll i=x+1;i<=n;i++) //从 输入的第一个数开始,依次往后遍历{dfs(i,sum+a[i],k+1);}
}
下面是完整代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+7;
ll a[maxn];
bool isp[maxn];
int p[maxn];
int pNum=0;
ll n,m;
ll ans=0;
void prime1()
{for (int i = 2; i <= maxn; i++){if (!isp[i])p[pNum++]=i;for (int j=0;j<pNum&&i*p[j]<=maxn;j++){isp[i*p[j]]=1;if((i%p[j])==0)break;}}
}
void dfs(ll x,ll sum,ll k)
{if(isp[sum]==0)ans++;if(k>=m)return;for(ll i=x+1;i<=n;i++){dfs(i,sum+a[i],k+1);}
}
int main()
{prime1();ll t;scanf("%lld",&t);while(t--){scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){dfs(i,a[i],1);}printf("%lld\n",ans);}return 0;
}
科林明伦杯哈尔滨理工大学第九届程序设计竞赛 H 题(dfs)相关推荐
- 科林明伦杯哈尔滨理工大学第九届程序设计竞赛
A氵题 B错排公式 C 不太懂卡塔兰数是啥东西,于是乎写的是一个n^2的dp,暴力打表写文件里,然后复制到代码里,然后切掉了 打表代码 #include<bits/stdc++.h> us ...
- “科林明伦杯” 哈工大第十届程序设计竞赛【BCDEFHJ签到】
问题B. 减成一 题目描述 存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多少次操作,可以让所有数都变成1. 数据保证一定有解. 输入描述: 输入t,代表有t组数据.每组数据输入 ...
- 科林明伦杯”哈尔滨理工大学第十届程序设计竞赛B(减成1)
科林明伦杯"哈尔滨理工大学第十届程序设计竞赛 存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多少次操作,可以让所有数都变成1. 数据保证一定有解. 输入描述: 输入t, ...
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解
"科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛 E 赛马 python
"科林明伦杯"哈尔滨理工大学第十届程序设计竞赛 E 赛马 python E 好家伙 田忌赛马真就 匹配就不解释了 思路,主要咱不止一匹马 所以就最好的比 对方比这个数小的即可 所以 ...
- 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(12.10)
"科林明伦杯"哈尔滨理工大学第六届程序设计团队赛 水题已去除.. B题 Time 原题链接:http://acm.hrbust.edu.cn/index.php?m=Proble ...
- 科林明伦杯哈尔滨理工大学第六届程序设计团队赛-Team模拟
题目链接 题意:有三种操作,1,代表加入数字,2,代表拿出数字,3,代表撤销第i个操作 思路:正着模拟会超时,因为有无限的撤销操作需要递归到上方,所以我们先倒着把撤销的操作都标记下,然后正着模拟(不需 ...
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)---全题目+题解
文章目录 A.点对最大值 B.减成一 C.面积 D.扔硬币 E.赛马 F.三角形 G.养花 H.直线 I.字典序 J.最大值 A.点对最大值 链接:https://ac.nowcoder.com/ac ...
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) F
F 三角形 链接:https://ac.nowcoder.com/acm/contest/5758/F 来源:牛客网 小明有一根长度为a的木棒,现在小明想将木棒分为多段(每段木棒长度必须为整数), 使 ...
最新文章
- 七十三、Vue项目城市详细页的动态路由,Banner布局和公用图片画廊组件拆分
- c语言规定在一个源程序中main函数的位置是什么?
- 祝各位网友儿童节快乐!
- Sonar与jenkins集成
- powerpc和arm_为什么我喜欢ARM和PowerPC
- (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
- Spring @Autowird
- SAP License:SAP CWM功能及限制
- LeetCode 230二叉搜索树中第k小的元素
- MLN Alchemy
- 解决pgadmin4导入导出数据时报错 Utility file not found. Please correct the Binary Path in the Preferences dialog
- 电脑通过android手机上网
- 昭阳k20-80拆机过程
- python获取北京时间
- 目标检测经典论文——YOLOv3论文翻译:YOLOv3: An Incremental Improvement(YOLOv3:增量式的改进)
- 把手机自带计算机软件,怎样删除手机自带软件
- Atitit q2016 qb doc list on home ntpc.docx
- 缺氧游戏黑科技计算机,《缺氧》怎么生存?缺氧bug黑科技小技巧使用方法一览...
- 垃圾收集概述和垃圾收集算法(超详细介绍)
- oracle分析函数用途,深入探讨:oracle中row_number() over()分析函数用法