蓝桥杯真题2

1.杨辉三角形

在这里插入图片描述

2.k倍区间

在这里插入图片描述

#include<iostream>
using namespace std;

int n,k;
long long arr[100010];
int cnt[100010];

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>arr[i];
        arr[i]+=arr[i-1];
    }
    cnt[0]=1;//当遍历出首个从头开始的为k倍的前缀和时,它不需要模k左端点即可形成模k区间,为满足通解将0作为其模k左端点,故cnt[0] ++
    long long res=0;
    for(int i=1;i<=n;i++)//遍历右端点
    {
        res+=cnt[arr[i]%k];//把前i个端点中与i余数相同的点的个数加上
        cnt[arr[i]%k]++;//cnt存余数相同的个数
    }
    cout<<res<<endl;
    return 0;
}

3.质数拆分

题目描述:

2019可以被分解成若干个两两不同的素数,请问不同的分解方案有多少种?
注意:分解方案不考虑顺序,如 2 + 2017 = 2019 和 2017 + 2 = 2019 属于同一种方案。

答案:55965365465060

#include <iostream>
using namespace std;

const int N = 2500;

int k = 1;
int st[N], prime[N];
long long f[N][N];

void init()// 埃氏筛法
{
    for (int i = 2; i <= 2019; i ++)
    {
        if(!st[i])
        {
            prime[k ++] = i;
            for (int j = i + i; j <= 2019; j += i) st[j] = true;
        }
    }
}

int main()
{
    init();
    
    f[0][0] = 1;//容量为0时,选0个也是一种方案,注意dp的初始化 
   
    for (int i = 1; i < k; i ++)
        for (int j = 0; j <= 2019; j ++) //遍历到当前i位置时,总和为j的方案数 
        {
            f[i][j] = f[i - 1][j];                                  
            if(j >= prime[i]) f[i][j] += f[i - 1][j - prime[i]];     
        }
    
    cout << f[k - 1][2019] << endl;
    return 0;
}

4. 回路计数

在这里插入图片描述

5.李白打酒

题目描述:

话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb
就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

#include<iostream>
using namespace std;

int cnt;

void dfs(int a,int b,int sum,int ans)
{
    if(ans==14)
    {
        if(sum==1) cnt++;
        return;
    }
    if(a<5) dfs(a+1,b,sum*2,ans+1);
    if(b<9) dfs(a,b+1,sum-1,ans+1);
}

int main()
{
    dfs(0,0,2,0);
    cout<<cnt<<endl;
    return 0;
}

6. 李白打酒加强版

在这里插入图片描述

dfs:

#include<iostream>
using namespace std;

int cnt;
int n,m;

void dfs(int a,int b,int sum,int ans)
{
    if(ans==n+m-1)
    {
        if(sum==1) cnt++;
        return;
    }
    if(a<n) dfs(a+1,b,sum*2,ans+1);
    if(b<m-1&&sum!=0) dfs(a,b+1,sum-1,ans+1);//剪一下,没酒时遇花是不合法的
}

int main()
{
    cin>>n>>m;
    dfs(0,0,2,0);
    cout<<cnt<<endl;
    return 0;
}

dp:

#include<iostream>
using namespace std;

int n,m;
const int mod=1e9+7;
int f[110][110][110];

int main()
{
    cin>>n>>m;
    f[0][0][2]=1;
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            for(int k=0;k<=m;k++)//酒最多为m
            {
                if(i&&k%2==0) f[i][j][k]=(f[i][j][k]+f[i-1][j][k/2])%mod;
                if(j) f[i][j][k]=(f[i][j][k]+f[i][j-1][k+1])%mod;
            }
        }
    }
    cout<<f[n][m-1][1]<<endl;
    return 0;
}

7. 货物摆放

在这里插入图片描述
答案:2430

#include<iostream>
#include<vector>
using namespace std;

long long n=2021041820210418;
vector<long long> v;

int main()
{
    for(int i=1;i<=n/i;i++)//统计出所有因子,然后循环遍历
    {
        if(n%i==0)
        {
            v.push_back(i);
            v.push_back(n/i);
        }
    }
    int cnt=0;
    for(int i=0;i<v.size();i++)
    {
        for(int j=0;j<v.size();j++)
        {
            if(n%(v[i]*v[j])==0) cnt++;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢nn

心动不如行动,感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值