- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564477 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174566
- 相册
- 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组决赛题解第二题) l" t- u4 W8 ]! }3 F/ f" B
3 D: x9 s5 F2 o4 i! T
求两两不同的素数组成2019的方案数2 u& d6 [3 f) Z
注意点:并不是两个不同的素数,再者直接搜索应该会TimeLimited,所以用dp或者记忆化搜索,方案数可能很多,记得用long long% X6 N/ @* `% w4 S/ o+ {/ L s
结果: 559653654650603 E, R, V, {% z L3 O. @7 Q( A
代码:5 d. }' E' [' ]6 i
#include<bits/stdc++.h>
% X3 @! B5 U+ E% L: H% j#define mem(a,b) memset(a,b,sizeof(a))
0 O/ H& K% z2 h5 Z6 U4 v( l+ ]2 Husing namespace std;
2 \9 J' x6 x2 H* ^1 ytypedef long long ll;3 \- k+ U( i( R0 C
const int inf = 0x3f3f3f3f;
9 g% z- v+ c$ b( Q0 v; Xconst int maxn = 3e5+55555;8 i C% f3 k( F: w
const ll mod = 998244353; @* h/ @1 T6 D. z0 L# x
const double eps = 1e-7;+ f+ I( U& o, C1 S0 j
: X7 ]" p+ n# U6 J3 ybool vis[12345];
. y5 [) H- l- t9 }' \, Jvector<int>prime;
: d2 N* i8 I1 d2 y3 P0 Mll f[3000][3000];
9 d1 H S' @( O7 r. G1 X
# M0 g. N! w( s2 Y2 ~& ` |' h3 \, vvoid init() { //素数筛+ o7 D5 w. F7 \9 e% }
for(int i = 2;i<= 3000;i++) {
6 X, u, S2 f0 C if(!vis) {. _6 o1 Z& Z" I7 l; c/ t b3 |+ ^
for(int j = i*i;j<= 3000;j+= i) {* @ R! }& h" x3 U/ [2 O) ?. N# u
vis[j] = true;
: z& r! O4 y1 I$ f' D) L& p. h }
7 d2 W( _4 a! `0 W1 e: I }; h% r/ K) v$ i" s/ ~- Y& ]
}( ]- Z+ n3 [5 B0 f( `
for(int i = 2;i<= 2019;i++) {" V- e( Z$ j/ u8 `. r3 a* F
if(!vis) prime.push_back(i);
1 H% Y, z w$ W8 c* f }! ~$ d. ?6 K2 F
}
! X4 C! `1 k2 U- X0 v8 e B* o8 g! V6 B
ll dfs(int pos,int sum) {
* i* V2 S0 w S \6 H if(f[pos][sum]!= -1) return f[pos][sum]; Z* e7 Y# q& y3 i
if(sum == 2019) return 1;
3 e6 M# K' @$ f. h: C if(pos>= prime.size()||sum> 2019) return 0;
- Y. k% {8 J6 k2 Y: m* K! g
: m$ D3 A) L1 y" d! c( x2 B; f ll ans = 0;
, h0 N: \3 h. } ans+= dfs(pos+1,sum);// 不要当前这个素数
' G# u+ K: F6 U, l% j. Q( r ans+= dfs(pos+1,sum+prime[pos]);// 要当前这个素数
3 K' R$ s$ E! N( v9 w$ r return f[pos][sum] = ans;6 c! o' X0 J9 G6 C$ A2 s
}& e9 D o% [* x
$ [9 k$ W" C2 }: f- q6 l+ }
int main() {) G! J7 ~3 l' K8 A$ M
init();4 W! z, B6 ?4 ]. X0 l" ^/ j! p# {
* t/ \ N/ N6 H; c4 M! O! z mem(f,-1);
% a8 w. j: T" F4 q' d" ^& z ll ans = dfs(0,0);* g3 z5 I" w4 E6 h* g- l3 X
cout<<ans<<endl;
! F2 ]3 R0 J4 n$ ~6 U
0 ?# P& A' K d8 t# @ return 0;
5 a" g" R1 X2 y9 ^. z}0 N, u; Y& B" T+ B
---------------------
( G) `6 @) S: J6 Z( L作者:nka_kun " r8 Y8 @2 o2 |5 \3 v
2 G v1 R* O/ h9 Z) V$ p6 ^
# ^; |2 B* [5 v |
zan
|