当前位置: 首页 > news >正文

ABC406E 题解

E. Popcount Sum 3

题意

多测,共 T T T 组数据。

给你整数 N N N K K K,找到所有满足以下条件的数 x x x 的和:

  • popcount ( x ) = K \text{popcount}(x)=K popcount(x)=K 且 $ x\le N$,其中 popcount(x) \text{popcount(x)} popcount(x) 表示 x x x 在二进制形式中 1 1 1 的数量

思路

提供一个不是 DP \text{DP} DP 的做法。为了方便表示,设 998244353 = M 998244353=M 998244353=M

对于 N N N 二进制形式中每个是 1 1 1 的位数 d d d(从后往前数,最右边的是第 1 1 1 位),把它之前(不包括自己)的所有是 1 1 1 的位都默认设成 1 1 1,设之前有 c n t cnt cnt 位是 1 1 1(可以预处理 出前面是 1 1 1 的数位表示的数的总和,即 s u m = ∑ i = [ x ] 在二进制形式下的位数 d + 1 2 d − 1 sum=\sum_{i=[x]在二进制形式下的位数}^{d+1} 2^{d-1} sum=i=[x]在二进制形式下的位数d+12d1),在之后(不包括自己)的共 d − 1 d-1 d1 位中任意放入 K − c n t K-cnt Kcnt 1 1 1,很明显,方案数为 C d − 1 K − c n t \text{C}_{d-1}^{K-cnt} Cd1Kcnt。我们把这些方案全部列出来:

下图展示了 k − c n t = 3 , d − 1 = 5 k-cnt=3,d-1=5 kcnt=3,d1=5 的情况

它是 C d − 1 K − c n t \text{C}_{d-1}^{K-cnt} Cd1Kcnt 个长度为 K − c n t K-cnt Kcnt 的序列,每个数在 1 ∼ d − 1 1 \sim d-1 1d1 之间,可以证明, 1 ∼ d − 1 1 \sim d-1 1d1 之间的每一个数(每一位)出现的次数都一样,即每个数字(每一位)出现了 t = C d − 1 K − c n t × ( K − c n t ) d − 1 t=\displaystyle \frac{\text{C}_{d-1}^{K-cnt} \times (K-cnt)}{d-1} t=d1Cd1Kcnt×(Kcnt) 次:
i i i 位表示的数为 2 i 2^i 2i,则本次答案增加 Δ = ∑ i = 1 d − 2 2 i × t + C d − 1 K − c n t × s u m = C d − 1 K − c n t × ( K − c n t ) d − 1 × ( 2 d − 1 − 1 ) + C d − 1 K − c n t × s u m \Delta=\sum_{i=1}^{d-2}2^i\times t+\text{C}_{d-1}^{K-cnt}\times sum =\displaystyle \frac{\text{C}_{d-1}^{K-cnt} \times (K-cnt)}{d-1}\times (2^{d-1}-1)+\text{C}_{d-1}^{K-cnt}\times sum Δ=i=1d22i×t+Cd1Kcnt×sum=d1Cd1Kcnt×(Kcnt)×(2d11)+Cd1Kcnt×sum

如果 c n t = K cnt=K cnt=K 就把答案加上 s u m sum sum 并跳出循环。

注意点:

  • 因为先取模再除法可能会出错,所以我们把除法换成乘法逆元,即 1 d − 1 m o d M = ( d − 1 ) M − 2 m o d M \frac{1}{d-1} \bmod M=(d-1)^{M-2}\bmod M d11modM=(d1)M2modM(可以用费马小定理证明)。

  • 同理, C n k \text{C}_n^k Cnk 也需要预处理,预处理出 f a c t i = i ! m o d M fact_i=i! \bmod M facti=i!modM r e v i = 1 i ! m o d M rev_i=\frac{1}{i!}\bmod M revi=i!1modM C n k = f a c t n × r e v k × r e v n − k \text{C}_n^k=fact_n\times rev_k\times rev_{n-k} Cnk=factn×revk×revnk

  • 记得开 long long \text{long long} long long,计算幂要用快速幂,不然超时。

C++ 代码

#include<bits/stdc++.h>
#define int long long
#define mpr make_pair
#define pb push_back
#define sz(v) (int)v.size()
using namespace std;
const int MOD=998244353;
int n,k;
int fact[64],rev[64];
int pw(int a,int b){int res=1;while(b){if(b&1) res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;
}
int C(int n,int k){if(n<k) return 0;return fact[n]*rev[k]%MOD*rev[n-k]%MOD;
}
void solve(){cin>>n>>k;vector<bool> v;while(n!=0){v.pb(n&1);n>>=1;}reverse(v.begin(),v.end());int ans=0,cnt=0,sum=0;for(int i=0;i<sz(v);i++){if(v[i]==0) continue;int dig=sz(v)-i;ans=(ans+(pw(2,dig-1)-1)*(C(dig-1,k-cnt)*(k-cnt)%MOD*pw(dig-1,MOD-2)%MOD)%MOD)%MOD;ans=(ans+C(dig-1,k-cnt)*sum)%MOD;cnt++;sum+=pw(2,dig-1);if(cnt==k){ans=(ans+sum)%MOD;break;}}cout<<ans<<endl;
}
signed main(){fact[1]=fact[0]=rev[0]=1;for(int i=2;i<=61;i++){fact[i]=fact[i-1]*i%MOD;}rev[61]=pw(fact[61],MOD-2);for(int i=60;i>=1;i--){rev[i]=rev[i+1]*(i+1)%MOD;}int T;cin>>T;while(T--){solve();}return 0;
}

文章转载自:

http://st6WibUl.fbzyc.cn
http://Fg4PaqdA.fbzyc.cn
http://huAfmXXw.fbzyc.cn
http://kbPIKfdB.fbzyc.cn
http://9v9IhJVr.fbzyc.cn
http://TPYIJMxB.fbzyc.cn
http://7Y2irFna.fbzyc.cn
http://QWqv63fw.fbzyc.cn
http://XZeNtGcO.fbzyc.cn
http://jlafp9xD.fbzyc.cn
http://rMp6gL4J.fbzyc.cn
http://Sk9TOVHX.fbzyc.cn
http://ck3BEttX.fbzyc.cn
http://gVZoEMNW.fbzyc.cn
http://ckgQAhJj.fbzyc.cn
http://OVHLTVdP.fbzyc.cn
http://pavQS689.fbzyc.cn
http://vg0gHa0G.fbzyc.cn
http://FKRTIPfS.fbzyc.cn
http://5wA3xATO.fbzyc.cn
http://plXa9SBg.fbzyc.cn
http://mvhxXRYF.fbzyc.cn
http://tKy5mOHn.fbzyc.cn
http://FDZR7lbY.fbzyc.cn
http://USPQindX.fbzyc.cn
http://QfZCF63I.fbzyc.cn
http://DW4hEgpc.fbzyc.cn
http://DCqDHXbY.fbzyc.cn
http://0zzCPrct.fbzyc.cn
http://ZpRneAFp.fbzyc.cn
http://www.dtcms.com/a/211036.html

相关文章:

  • 1.4 TypeScript 编译是如何工作的?
  • [案例六] NX二次开发减重块的实现(支持组件和实体)
  • 鸿蒙UI开发——上拉抽屉的更新与事件回调
  • CMake指令:add_library()
  • 单例模式总结
  • Python训练营---Day35
  • 【笔记】OpenCV的学习(未完)
  • 开发者工具箱-鸿蒙颜色转换器开发笔记
  • React Native 拼音及拼音首字母搜索组件开发
  • LLM Tuning
  • OpenLayers 开发环境搭建
  • 每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)
  • 模型参数详细介绍--Profiler
  • Python如何赋能自动驾驶地图构建?从点云处理到实时导航
  • Redis持久化机制:AOF与RDB深度解析
  • 电机控制储备知识学习(五) 三项直流无刷电机(BLDC)学习(四)
  • NetSuite Emoji的应用
  • JavaScript 文件类型识别与状态图片返回系统
  • [AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)
  • 开发者工具箱-鸿蒙DNS查询工具开发笔记
  • vue3 发票税率 计算
  • 汉字不仅是一种语言 还是当作艺术形式来展现
  • Python 基础语法速查手册:从入门到精通
  • 怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化
  • STM32上配置图像处理库时常见错误总结
  • 人脸美颜磨皮祛痘1:数据集说明(含下载链接)
  • ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)
  • Linux系统之pwd命令的基本使用
  • juc面试题
  • Development靶机通关笔记