洛谷P1036 選數(DFS 深搜 線性篩 列舉)

2021-10-04 18:36:06 字數 937 閱讀 4094

題目大意:n個數中選擇k個求和,問結果有幾個素數。

思路:c(n,k)種可能,每種都需要遍歷到,考慮到n <= 20,1應該夠了,可以試試。

但是我也這樣暴力就沒有寫文章的意義了,我使用了線性篩得出所有的1e8的素數,去二分查詢判定,用以確定結果是否為素數,計算為1e8,查詢,log2(1e8),不到32.

具體實現,上ac**:

#include#define fori(i,a,b) for(int i = a;i < b;i++)

#define mod 1000000007

#define ll long long

#define pi acos(-1)

#define ford(i,a,b) for(int i = a;i >= b;i--)

#define fast_input() ios::sync_with_stdio(0)

#define inf 0x3f3f3f3f

#define maxn 10000005

using namespace std;

char flag[maxn];

int prime[maxn / 2 + 1];

int cnt = 0;

int n,k;

int num[22];

int ans;

void euler(int* prime,char*vis,int n,int &cnt)

}}int check(int num)

void dfs(int i,int j,int sum)

return;

} dfs(i + 1,j + 1,sum + num[i]);

dfs(i + 1,j,sum);

}int main()

洛谷P1036 選數(DFS)

已知 nnn 個整數 x1,x2,xnx 1,x 2,x nx1 x2 xn 以及111個整數kkk k3 7 12 223 7 12 223 7 12 22 3 7 19 293 7 19 293 7 19 29 7 12 19 387 12 19 387 12 19 38 3 12 19 343...

洛谷P1036 深搜

原題目 給定n個數字裡面選擇k個數字進行操作,使用遞迴操作。也類似於深搜。include using namespace std int ans 0,n,k,a 25 bool prime int x return true void rec int start,int count,int sum ...

洛谷P1036 選數

已知 n 個整數 x1,x2,xn,以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。例如當 n 4,k 3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為 3 7 12 22 3 7 19 29 7 12 19 38 3 12 19 34。...