数学建模社区-数学中国

标题: 2019第十届蓝桥杯B组决赛题解第二题 [打印本页]

作者: 杨利霞    时间: 2019-6-28 15:49
标题: 2019第十届蓝桥杯B组决赛题解第二题
2019第十届蓝桥杯B组决赛题解第二题
) b" h) G* \' C  m2 x& u) q( e: B
求两两不同的素数组成2019的方案数
! r( o4 w3 C3 {6 f( i! O0 c注意点:并不是两个不同的素数,再者直接搜索应该会TimeLimited,所以用dp或者记忆化搜索,方案数可能很多,记得用long long
+ F9 k3 ?- Z2 r+ o6 Y结果: 55965365465060) G# g8 {' \6 ^2 j) v( b
代码:
) ~7 x9 G& h* c1 u: _: W#include<bits/stdc++.h>4 g7 J  g; ?, N7 m
#define mem(a,b) memset(a,b,sizeof(a))
# S% L9 f' s4 w" Ausing namespace std;
$ M* b. |1 i  a' c  qtypedef long long ll;
/ x/ u/ J8 N7 N# ]" [! @' ^* iconst int inf = 0x3f3f3f3f;, z- B" y$ m  U" V
const int maxn = 3e5+55555;
& M9 L% F9 H' V9 q' ?const ll mod = 998244353;
7 Y- j0 e- i7 f% X6 \+ v4 aconst double eps = 1e-7;$ C$ U/ f- k. t4 V! N  h
+ E0 u9 H, M$ o, Q3 f
bool vis[12345];
8 ?! ~% i2 S1 R' N# m1 nvector<int>prime;
- P- t: r+ V6 W, `  h4 sll f[3000][3000];
0 n/ k5 z, \' X0 T+ c6 G- X1 f0 O7 V; F: ^) h8 Z! T8 z$ ^1 R
void init() { //素数筛1 S8 A4 n" z. ?: x# K1 U
    for(int i = 2;i<= 3000;i++) {3 ]. E0 L; \6 D' a: _
        if(!vis) {' m% d  {# a3 f# e  s: t4 R7 t8 R3 m
            for(int j = i*i;j<= 3000;j+= i) {, t2 U. x& m8 |) _: n0 C. j: x! g
                vis[j] = true;: {+ D. s' i& J1 y; F
            }. d& d* L: m" q  `2 D
        }4 i- b3 d4 ~/ i4 l
    }0 U/ D+ u3 }2 n' n
    for(int i = 2;i<= 2019;i++) {( y! f7 D! f  o1 x* L% u; ~2 |
        if(!vis) prime.push_back(i);2 ?. M5 M( f* ~! i
    }
9 y9 b: {; T( u}
) M2 Q/ ~/ f5 u, I, D
: W; x- x8 e- j8 @ll dfs(int pos,int sum) {* p+ E9 s' s, {+ T
    if(f[pos][sum]!= -1) return f[pos][sum];  x  o5 W# V) t5 s) H$ x# V
    if(sum == 2019) return 1;
( {8 j+ h# }- I  A2 m2 y    if(pos>= prime.size()||sum> 2019) return 0;* F2 ~/ G- w6 o6 x, t9 Y* h9 ^

' X7 y- S/ G. r* |1 v" l+ O3 o    ll ans = 0;
7 |' j# {# }2 D+ ]  t1 z    ans+= dfs(pos+1,sum);// 不要当前这个素数* ]( Q3 n5 m, R! @9 M
    ans+= dfs(pos+1,sum+prime[pos]);// 要当前这个素数' i. \$ P, R8 Z6 H, A) @% S; h! d# D
    return f[pos][sum] = ans;
" c; t2 n* h! P  U$ C}
, k5 ?) M4 F- [( A8 q2 x; }
' Y; ~. o" @8 x. ^$ c4 Cint main() {1 l* Z" m& \" q$ f! J8 g& e
    init();2 @9 K7 v* \* Y( @3 J* R

" b. x. Y6 p0 B% K2 P    mem(f,-1);/ Y* L1 v' |1 o# n0 r* O7 C
    ll ans = dfs(0,0);
; ~5 h+ d% b% H- C' O    cout<<ans<<endl;
; d; [" M' O4 S- z: w7 I5 _
+ _4 P( x% Z& ~5 n* L8 ]9 ~$ \0 n- d    return 0;; M1 S5 w; w+ {. L' G# _3 t6 B
}; m0 d; r% w" H& |! v; I& u
---------------------
) c  s# S2 ~6 ?$ y作者:nka_kun ) @* c+ \, B/ @5 L' s

0 r2 m8 u" B! {4 {
/ q$ ^' ~, r' B8 s7 ]. a




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5