美文网首页
2019年第十届蓝桥杯(决赛)国赛B组C++(B)

2019年第十届蓝桥杯(决赛)国赛B组C++(B)

作者: 优劣在于己 | 来源:发表于2020-11-05 19:03 被阅读0次

题目: 2019可以被分解成若干个两两不同的素数,请问不同的分解方案有多少种?

注意:分解方案不考虑顺序,如2+2017=2019和2017+2=2019属于同一种方案。

思路先求出2019内的所有素数时间复杂度O(n)(求质素用的欧拉线性筛法,这部分不理解前面有写https://www.jianshu.com/p/ef57c98c0e4e
再dfs爆索,中间记得剪枝

#include<bits/stdc++.h>
#define mem(kk,int) memset(kk,int,sizeof kk);
using namespace std;
typedef long long ll;

vector<int>prime;//这里写int prime[];也可
bool vis[4000];
ll f[4000][4000];

void init(){//求素数,放入prime里面
    for(int i=2;i<=2019;i++){
        if(!vis[i])prime.push_back(i);
        for(int j=0;i*prime[j]<=2019&&j<prime.size();j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}

ll dfs(ll num,ll sum){
    if(f[num][sum]!=-1)return f[num][sum];
    if(sum==2019)return 1;
    if(num>=prime.size()||sum>2019)return 0;
    ll ans=0;
    ans+=dfs(num+1,sum);//选
    ans+=dfs(num+1,sum+prime[num]);//不选
    return f[num][sum]=ans;
}

int main(){
    init();
    /*for(int i=0;i<prime.size();i++)
        cout<<prime[i]<<" ";
    cout<<endl;*/
    mem(f,-1);
    ll ans=dfs(0,0);
    cout<<ans<<endl;
    return 0;
}

相关文章

网友评论

      本文标题:2019年第十届蓝桥杯(决赛)国赛B组C++(B)

      本文链接:https://www.haomeiwen.com/subject/cayavktx.html