- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565654 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174919
- 相册
- 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组决赛题解第二题
; a; J$ B" ?' K! Q
# w7 f( p3 E4 }5 t求两两不同的素数组成2019的方案数( N' O) ]$ b. w% ?9 Z& M9 |
注意点:并不是两个不同的素数,再者直接搜索应该会TimeLimited,所以用dp或者记忆化搜索,方案数可能很多,记得用long long
+ J" J! I4 K9 L+ p结果: 55965365465060
' E8 e5 l: s4 S4 K3 \, ^2 V代码:
: d6 I1 N1 o& ?1 n7 `#include<bits/stdc++.h>' {0 T, x0 a+ x' _- n3 V
#define mem(a,b) memset(a,b,sizeof(a))
4 I Q# T0 j2 t3 S/ C8 nusing namespace std;
. D3 ]5 u" Z0 itypedef long long ll;) {( J( U9 m4 H$ k$ L
const int inf = 0x3f3f3f3f; }4 N; ]" Q3 ^5 X/ |' r3 m
const int maxn = 3e5+55555;2 E2 S H7 g2 }! ]. a/ x+ x1 B
const ll mod = 998244353;8 @$ B) T* S6 b, p5 E j# ~
const double eps = 1e-7;
6 f/ P) Q: L _7 q6 ]$ T% {; h& |4 M
bool vis[12345];
) T0 O% K; `1 f% A- Y, cvector<int>prime;" e; G4 d0 d. c) s
ll f[3000][3000];
8 G. Y X, ~) J {* k+ Q$ R2 t c7 x, `) |0 O
void init() { //素数筛. w, \! n& u+ g- E
for(int i = 2;i<= 3000;i++) {& `2 D# i+ y- |# o8 c+ ^0 I& u
if(!vis) {# G$ t/ Y# u. \# T
for(int j = i*i;j<= 3000;j+= i) {
; f1 `4 ~- ?' Z2 x" v vis[j] = true;
8 b. o& q1 I/ a& L. U! ]! g }% N* _* W0 \+ w$ z: E. i& E- p
}
2 o6 C- b, k; G5 I1 c3 f' g }: ?: g! U" b. n3 {
for(int i = 2;i<= 2019;i++) {# _$ S9 F2 n+ }7 r& K# ^! ]
if(!vis) prime.push_back(i);
4 p2 s2 S' P6 v3 o& M, } }
$ O: a4 p! S$ P& q! G}
7 q. S6 g1 f1 Z* ]: R7 R* ]! a0 s V
ll dfs(int pos,int sum) {
/ Q& l* l; s% Z" F if(f[pos][sum]!= -1) return f[pos][sum];
+ b [" `' y; M5 g' \ if(sum == 2019) return 1;/ {7 a& U6 f0 R+ ?
if(pos>= prime.size()||sum> 2019) return 0;
! f" _8 y4 F1 p3 M2 T# ?$ S1 n& I3 s, m! t; Q3 u6 E
ll ans = 0;; D1 M" s2 k# a/ L3 R
ans+= dfs(pos+1,sum);// 不要当前这个素数* B6 i( E1 f0 j* p
ans+= dfs(pos+1,sum+prime[pos]);// 要当前这个素数
5 ^: P- D' X6 E7 C% I1 u0 j" M return f[pos][sum] = ans;
# M7 L R* l* d% e# Z; i}
6 I0 B: k8 g" H$ K& U$ G, S3 U; {( @! ?1 _3 m4 \
int main() {+ Q5 B. ?9 ]9 O
init();5 h0 X) l1 L, d8 D! s6 N
' x- t' L9 U! M( F8 a# I
mem(f,-1);# C: C" ]+ I" d# r9 ^% r
ll ans = dfs(0,0);; m( c% \" N" {( S4 O$ [4 E( p, a
cout<<ans<<endl;
+ e- w/ q# a6 H, K* L7 v% i
" i4 x8 d3 `0 F return 0;
& C/ b* {) R3 X+ I}) E( a5 l3 K4 k# ?- D
--------------------- 8 u' W& z4 \# G8 ~/ a1 T
作者:nka_kun 7 e# i% t* V, f+ p: }. r
% [2 ^4 W9 f6 \9 h0 L' r
- k% [3 U$ c/ C |
zan
|