首页 > 其他分享 >2024年牛客暑期多校训练营1 A题 A Bit Common题解

2024年牛客暑期多校训练营1 A题 A Bit Common题解

时间:2024-07-19 16:20:49浏览次数:18  
标签:奇数 题解 ll 多校 long 2024 ans 序列 2k

题目的大意:

  • 首先,给你一个长度为n的序列A,A序列中每一个元素全都小于2m,并且大于等于0。
  • A序列要满足存在一个非空子序列的与运算(&)和为1;
  • 输出这样的A序列有几个,最后对正整数q取模。(1 <= n , m <=5000 , 1 <= q <=109)
  • 输入只有一行n , m , q,输出包含一个整数。

 

题解:

  要满足A序列的一个子序列 & 运算和为 1,则至少存在一个奇数。设A序列中存在k个整数,有n-k个偶数。

  下图将每个数转换为2进制之后的 (m x k) 图 ,图中每一列都是一个数。

 


在这个图中每一行一共有2k种,去除全是1的情况(因为在取子序列时所有数全是奇数,要保证最后&和的结果是1,则每一行至少有一个0)有2k-1种,然后一共有m-1行,那么奇数总共有(2k-1)m-1种情况。

同理可得,偶数有2(n-k)(m-1)种情况。

又因为实际情况中奇数和偶数都是随机的,则总共有Ck2(n-k)(m-1) · (2k-1)m-1种情况。最后再从1到n进行累加得 ∑nk=1Ck2(n-k)(m-1) · (2k-1)m-1

 

代码编写:

  写代码的过程中主要有两个难点。一是求幂,因为k可以取到5000的,25000已经超过了long long的数据范围,我的解决方法是快速幂。二是求组合数,这里我采用了杨辉三角求组合数。

  先讲一下快速幂。举个例子,求310,它可以变成95 。 这里5是奇数,我们将它变成 9 x 94,继续降低它的幂,变成9 x 812,最后变成 9 x (812)1

  在这个过程中,我们实际计算了(3*3)、(9*9)、(81*81)和 (9*812),我们需要计算10次,现在只需要计算4次,应用快速幂我们可以将O(n)的算法优化到O(logn)。

ll fast_POW(ll a ,ll b,ll c) //a是底数,b是指数,c是模
{
    ll ans=1;
    while(b)
    {
        if(b&1)//判断b是否为奇数
     { ans=(ans*a)%c; } a=(a*a)%c; b>>=1;//指数减小一倍 } return ans; }

  然后再讲一下杨辉三角求组合数

  首先Cnm=Cnm-1+Cn-1m-1,取第m个数时可以分两种考虑取或者不取,如果取则从剩下的m-1个数中取n-1个数,如果不取则从剩下的m-1个数中取n个数。

  那么就可以通过递推公式dp[ i ][ j ]=dp[ i-1 ][ j ] + dp[ i-1 ][ j-1]。 

 

i \ j 0 1 2 3 4 5 6 7 ....
0 1                
1 1 1              
2 1 2 1            
3 1 3 3 1          
4 1 4 6 4 1        
5 1 5 10 10 5 1      
6 1 6 15 20 15 6 1    
7 1 7 21 35 35 21 7 1  
....                 1
typedef long long ll;
ll combination[5005][5005];

   int q=1e9;
    for(int i=0;i<=5001;i++)
    {
        combination[i][0]=1;
        combination[i][i]=1;
    }
    for(int i=1;i<=5001;i++)
    {
        for(int j=1;j<=i;j++)
        {
            combination[i][j]=(combination[i-1][j]%q+combination[i-1][j-1]%q)%q;//为了防止最后的值超出限制,要进行取模。
        }
    } 

  完整代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll combination[5005][5005];

ll fast_POW(ll a ,ll b,ll c)
{
    ll ans=1;
    while(b)
    {
        if(b&1){
            ans=(ans*a)%c;
        }
        a=(a*a)%c;
        b>>=1;
    }
    return ans;
}

inline ll comb(ll n, ll m)
{
    return combination[n][m];
 } 
void solve(ll n ,ll m , ll q)
{
    for(int i=0;i<=5001;i++)
    {
        combination[i][0]=1;
        combination[i][i]=1;
    }
    for(int i=1;i<=5001;i++)
    {
        for(int j=1;j<=i;j++)
        {
            combination[i][j]=(combination[i-1][j] % q +combination[i-1][j-1] %q)%q;//一定要注意取模,每一个可能超出模q的运算都要取模,不然会非常折磨。
        }
    } 
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        ll ji=fast_POW(2, i ,q)-1;
        ans += comb(n , i)  * fast_POW(ji,m-1,q) %q * fast_POW(fast_POW(2,n-i,q),m-1,q);//一定要注意取模,每一次可能超出模q的运算都要取模,很折磨。
        ans=ans%q; 
    }
    cout << ans;
}


signed main()
{
    ll n,m,q;
    cin >> n >> m >> q;
    solve(n,m,q);
    return 0;
}

 



  

标签:奇数,题解,ll,多校,long,2024,ans,序列,2k
From: https://www.cnblogs.com/salute-to-Mr-Lynch/p/18311430

相关文章

  • 2024 电动汽车辅助驾驶系统算力天梯图 All In One
    2024电动汽车辅助驾驶系统算力天梯图AllInOne电动车算力天梯图demosTeslaModelYHW4.0(......
  • Windows 10 on ARM, version 22H2 (updated Jul 2024) ARM64 AArch64 中文版、英文版
    Windows10onARM,version22H2(updatedJul2024)ARM64AArch64中文版、英文版下载基于ARM的Windows10请访问原文链接:https://sysin.org/blog/windows-10-arm/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows10,version22H2(releasedNov2021)......
  • Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
    Windows11version23H2中文版、英文版(x64、ARM64)下载(updatedJul2024)Windows11,version23H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows11目前版本所有的日期都按照I......
  • Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
    Windows11version22H2中文版、英文版(x64、ARM64)下载(updatedJul2024)Windows11,version22H2,企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows11目前版本所有的日期都按照I......
  • Windows 10 version 22H2 (updated Jul 2024) 中文版、英文版下载
    Windows10version22H2(updatedJul2024)中文版、英文版下载Windows1022H2企业版arm64x64请访问原文链接:https://sysin.org/blog/windows-10/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows10更新历史记录Windows10,version22H2,allediti......
  • Windows Server 2022 中文版、英文版下载 (updated Jul 2024)
    WindowsServer2022中文版、英文版下载(updatedJul2024)WindowsServer2022x64,Version21H2请访问原文链接:https://sysin.org/blog/windows-server-2022/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org此次发布更新了什么?答:版本号,当然还有…2021.09.01更......
  • 【2024-07-17】连岳摘抄
    23:59没有永远的成功,做任何事如果达到了顶峰就会发生变化。不要试图对抗这种变化,要准确地掌控前进与后退的时机,遇到自己无法驾驭的情形,不要试图逆势而动。但这并不是简简单单地躲避或败下阵来,一定要向前更进一步,向上更高一层。                ......
  • 【学术会议征稿】第三届智能电网与能源系统国际学术会议(SGES 2024)
    第三届智能电网与能源系统国际学术会议20243rd InternationalConferenceonSmartGridandEnergySystems  第三届智能电网与能源系统国际学术会议(SGES2024)将于2024年10月25日-27日在郑州召开。   智能电网可以优化能源布局,让现有能源体系最大化的发挥其产能......
  • 【2024】springboot OA公文发文管理系统
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • [NOI2007] 项链工厂 题解
    前言题目链接:洛谷;Hydro&bzoj。题意简述yzh喜欢写DS题!你要维护一个环:顺时针移动\(k\)位;翻转\(2\simn\);交换\(i\)与\(j\);区间覆盖;查询整个环有几个颜色段;查询\(i\simj\)有几个颜色段。题目分析平衡树板子啊,代码很好写,\(273\)行。但是为什么不使用线......