首页 > 其他分享 >P1036 [NOIP2002 普及组] 选数

P1036 [NOIP2002 普及组] 选数

时间:2024-03-27 19:31:25浏览次数:27  
标签:25 cnt NOIP2002 int 选数 个数 P1036 dfs include

思路:也算典型的dfs,题目就是要求从n个数中选择k个数,计算这k个数的和,看这个和是否是素数。我们知道在dfs时相当于是进行全排列,而结果要求的是组合后和的情况。根据排列和组合的关系,他们之间差K!倍,所以需要在dfs求得个数cnt后除以k!。

题目:

AC代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;

//输入n,k,从n个数中选k个数
int n,k;
int a[25];//记录n个数
int path[25];//记录选择的k个数
bool vis[25];//记录n个数的状态
int cnt = 0;
int ss=1;

void dfs(int u){
	if(u == k)//如果有k个数了
	{
		int sum=0;
		for(int i=0;i<k;i++){			
			sum+=path[i];
		}
	//	printf("summ%d\n",sum);
		//1不是素数			
		for(int i=2;i<sqrt(sum);i++){
			if(sum % i == 0){
				return ;
			}
		}
		cnt++;
		return;
	} 
	//要确保每种搭配方式只出现一次!!!!
	 
	for(int i=0;i<n;i++){
		if(!vis[i])//如果这个数没用
		{
			vis[i] = true;
			path[u] = a[i];
			dfs(u+1);
			vis[i] = false;
			path[u] = 0;
		} 
	}
	return ;
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}	

	for(int i=1;i<=k;i++){
		ss *= i;
	//	cout<<ss<<endl; 
	} 
	
	dfs(0);
	printf("%d",cnt/ss);
	return 0;
} 

结果:

标签:25,cnt,NOIP2002,int,选数,个数,P1036,dfs,include
From: https://blog.csdn.net/2401_82736456/article/details/137073954

相关文章

  • P1002 [NOIP2002 普及组] 过河卒(动态规划)
    #include<bits/stdc++.h>usingnamespacestd;longlongdp[30][30];boolm[30][30];intmain(){ intAx,Ay,Mx,My; cin>>Ax>>Ay>>Mx>>My; Ax+=2;Ay+=2;Mx+=2;My+=2; dp[2][1]=1; m[Mx][My]=1; m[Mx-2][My-1]......
  • 洛谷题单指南-搜索-P1032 [NOIP2002 提高组] 字串变换
    原题链接:https://www.luogu.com.cn/problem/P1032题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。解题思路:思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数但是,有一些细节还需要注意:1、有多种替换......
  • 别再低效筛选数据了!试试pandas query函数
    数据过滤在数据分析过程中具有极其重要的地位,因为在真实世界的数据集中,往往存在重复、缺失或异常的数据。pandas提供的数据过滤功能可以帮助我们轻松地识别和处理这些问题数据,从而确保数据的质量和准确性。今天介绍的query函数,为我们提供了强大灵活的数据过滤方式,有助于从复杂的......
  • 备选数列 / 函数
    FibonacciSequenceFormula\[F_{1}=1\]\[F_{2}=1\]\[F_{i}=F_{i-1}+F_{i-2}(i\geq3)\]List\[F_1=1\]\[F_2=1\]\[F_{3}=2\]\[F_{4}=3\]\[F_{5}=5\]\[F_{6}=8\]\[F_{7}=13\]\[F_{8}=21\]\[F_{9}=34\]......
  • 选数异或
    引言题目链接:https://www.luogu.com.cn/problem/P8773思路令dp[i]表示以i结尾且前i个中满足\(a_j\oplusa_k=x\)的数对中左侧数最靠近右侧的位置。假设有\(a_1\oplusa_2=x\)且\(a_4\oplusa_6=x\)则dp[3]=1,dp[7]=4那么给出区间后只需要判断......
  • 洛谷题单指南-递推与递归-P1002 [NOIP2002 普及组] 过河卒
    原题链接:https://www.luogu.com.cn/problem/P1002题意解读:从A(0,0)点走到B(n,m)点,只能向右或者向下,C点以及其控制点不能走。解题思路:根据题意,此题要么递归(DFS),要么递推(动态规划)先分析数据规模,最大从起点到终点要走40步,每个步有2种走法,一共240种路径,DFS会超时,且方案数必须用longlong......
  • 洛谷题单指南-暴力枚举-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • [NOIP2002 提高组] 均分纸牌
    [NOIP2002提高组]均分纸牌题目描述有堆纸牌,编号分别为。每堆上有若干张,但纸牌总数必为的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为堆上取的纸牌,只能移到编号为的堆上;在编号为的堆上取的纸牌,只能移到编号为的堆上;其他堆上取的纸牌,可以移到相邻......
  • P1036 [NOIP2002 普及组] 选数(递归)
    [P1036[NOIP2002普及组]选数]我的思路是运用递归实现一个树状分支例如3712194选3,每个情况为3-7-123-12-197-12-19注意我们用递归时在传参时要以和的形式传参。如果先求和再传参就会发生错误.#include<iostream>#include<string>#include<math.h>#include<......
  • P1002 [NOIP2002 普及组] 过河卒
    [NOIP2002普及组]过河卒题目描述棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点。卒行走的规则:可以向下、或者向右。同时在棋盘上\(C\)点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,\(A\)点\((0......