- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563327 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2019第十届蓝桥杯B组决赛题解第二题
3 H1 T4 I L: [' W( }# V) B" G# T. z) L H0 l6 a! l: |' t
求两两不同的素数组成2019的方案数! p6 e9 F7 `& K" u
注意点:并不是两个不同的素数,再者直接搜索应该会TimeLimited,所以用dp或者记忆化搜索,方案数可能很多,记得用long long
( H% v; o) ]) q) ?8 z0 y结果: 55965365465060/ O* h' x! L. x0 f
代码:7 p. B4 d5 \ Z i4 G3 F) a, Z
#include<bits/stdc++.h>
" ?; S; |3 R* k' A2 H* v( b) s#define mem(a,b) memset(a,b,sizeof(a))- n4 a. u, c( j; f6 u8 I
using namespace std;
, A7 G) E$ C. \6 w! @2 n- stypedef long long ll;
/ m, z( L' f. L. sconst int inf = 0x3f3f3f3f;
+ O& O- K x) F5 U: } cconst int maxn = 3e5+55555;, W/ d3 G$ B$ e! I' k7 q
const ll mod = 998244353;
; b4 i4 G. O7 E7 O- a+ p3 @const double eps = 1e-7;
! z% e- @; `; X2 S* h) [' X# \9 g2 @# U, p, S- v1 w7 k' T2 W
bool vis[12345]; ]! _- i, P4 A y6 ~0 D5 C
vector<int>prime;( p" t5 R& ?5 ^, h9 F) ?
ll f[3000][3000];
" c9 a! x n& [! F- b4 f: B4 q @ {: L# D7 x8 g6 l: H* \+ ]# l9 X
void init() { //素数筛& `& x- s, d2 y7 g5 F
for(int i = 2;i<= 3000;i++) {
# W- V0 @3 S9 O5 y5 \9 f' b Q5 R if(!vis) {; Z0 F3 Q3 A% q0 K' m0 r8 v
for(int j = i*i;j<= 3000;j+= i) {
8 w0 E3 j( U7 P) X/ i" n3 C vis[j] = true;
; d8 l; w- p0 [8 Z4 |6 r1 ` | }3 s+ N; s% b, I p
}/ z& [$ J; q. z
}
4 ~( C/ B0 J- Q' H for(int i = 2;i<= 2019;i++) {
/ k0 s3 Z" u$ Y% I: v if(!vis) prime.push_back(i);
) U/ W& Q6 q0 o/ {( k6 v }
5 s' ?$ Z. L( _. j3 Y' x* J}
' \: E$ P( y' Y# z( `& m5 R( a w9 v2 F+ j7 p1 d
ll dfs(int pos,int sum) {! o* L* q- Y$ y7 v: p
if(f[pos][sum]!= -1) return f[pos][sum];
1 g ^3 m( z2 c; \0 R. N' S if(sum == 2019) return 1; m7 [- X2 ?( F6 a0 R
if(pos>= prime.size()||sum> 2019) return 0;
T* d7 V" D5 Y* V
8 M+ y# v, K A% F: Y ll ans = 0;% a& M( R( p# {+ D
ans+= dfs(pos+1,sum);// 不要当前这个素数7 L9 e- ]% v& x% Q
ans+= dfs(pos+1,sum+prime[pos]);// 要当前这个素数* Y: E; O r6 k+ j* h8 g# g
return f[pos][sum] = ans;
/ v$ J0 g/ P1 X' F}
6 p6 E/ A0 g" X$ O( i h
6 O1 S: b# [: pint main() {
+ j) `5 @& T, O, D, I$ P init();3 R- \/ T. b0 d+ e U
( n4 W6 o+ Y' b5 _; N
mem(f,-1);; ?) ?: |6 Y- y7 C
ll ans = dfs(0,0);
" K/ Y5 j; f* g/ f$ e cout<<ans<<endl;8 j: s" ?3 G- q5 @/ v% _
; L/ q9 W: |: ~' }& u
return 0;4 ?: k! s5 w8 r" y6 q; \1 n9 A' P
}) ]: ^' ?* f# I$ [" a" E
---------------------
# _+ {8 g6 T# h作者:nka_kun 2 V U' W4 t! G( P, L
; {7 V# h4 I& j8 h2 s {9 p3 z
4 H2 v! h5 {6 w) P3 g2 k |
zan
|