第十届蓝桥杯c语言b组试题,2019年第十届蓝桥杯(决赛)国赛B组C++(B)

该博客介绍了如何使用深度优先搜索(DFS)算法找出所有将2019分解为不同素数的方法。首先,通过欧拉线性筛法求出2019以内的所有素数,并存储在prime向量中。接着,使用DFS进行遍历,记录每个状态(当前处理到的素数位置和总和),并进行剪枝优化,避免重复计算。最后,返回不同的分解方案数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

再dfs爆索,中间记得剪枝

#include

#define mem(kk,int) memset(kk,int,sizeof kk);

using namespace std;

typedef long long ll;

vectorprime;//这里写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

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

cout<

cout<

mem(f,-1);

ll ans=dfs(0,0);

cout<

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值