nssl1522-简单数数题【dp】
正题
题目大意
nnn个数的一个集合,求一个有多少个子集使得这个子集的所有子集的权值和的和是mmm的倍数
解题思路
考虑dp,选中集合中每一个数的贡献次数是2∣S∣−12^{|S|-1}2∣S∣−1,设fi,j,kf_{i,j,k}fi,j,k表示选到第iii,现在选了jjj个数,摸上mmm的余数是kkk。显然这个无法通过
考虑对mmm进行分类,如果mmm是一个偶数,那么加入一个新元素时,相当于整个集合(包括以后加入的)都得乘以222,那么我们可以让m/2m/2m/2即可。
如果mmm是一个奇数,那么考虑总和sumsumsum如果sum%m≠0sum\% m\neq 0sum%m=0那么显然sum∗2k≠0(k∈N)sum*2_{k}\neq 0(k\in N)sum∗2k=0(k∈N)。然后我们可以发现jjj的上界就是mmm拥有的222质因子个数,如果再大那么显然没有意义。
而kkk的上界是m2j−1\frac{m}{2^{j-1}}2j−1m,如果按照张上下界来进行枚举那么时间复杂度为O(nm)O(nm)O(nm)
codecodecode
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5100,XJQ=1e9+7;
int n,m,a[N],p[N],f[2][14][N*2],ans,M;
int main()
{freopen("data.txt","r",stdin);scanf("%d%d",&n,&m);p[0]=1;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=m*2;!(i&1);i>>=1,++M);f[0][0][0]=1;for(int i=1;i<=n;i++){for(int j=0,w=m*2;j<=M;j++,w>>=1)for(int k=0;k<w;k++)f[i&1][j][k]=f[~i&1][j][k];for(int j=0,w=m*2;j<=M;j++,w>>=1){int now=(j==M)?(j):(j+1);int mod=(j==M)?(w):(w/2);for(int k=0;k<w;k++)(f[i&1][now][(k+a[i])%mod]+=f[~i&1][j][k])%=XJQ;}}for(int i=1;i<=M;i++)ans=(ans+f[n&1][i][0])%XJQ;printf("%d",ans);
}
nssl1522-简单数数题【dp】相关推荐
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- 【XSY3952】简单的计数题(dp)
题面 简单的计数题 题解 首先题意可以转化为:给你一个长度为 nnn 的序列 ccc,求将 ccc 分成两个长度为 n2\dfrac{n}{2}2n 的相同的子序列的方案数. 考虑 dp,设 f(i ...
- [XSY] 简单的博弈题(博弈+dp+组合数+容斥)
简单的博弈题 对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜.(这不就是田忌赛马吗) 对于随机的对手,先考虑暴力怎么做: void check(int x,int w){if(x> ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 682 Solved: 364 Description 我们称 ...
- 洛谷2657 windy数(数位DP)
传送门 [题目分析] 数位DP经典题了. 考虑直接统计R内的windy数和L-1内的windy数,两者相减即为L~R之间的windy数. 考虑DP,记录当前位以及上一位所填的数,当前是否前面为前导零, ...
- 题解-路径数+算法-回荡dp
题解-路径数+算法-回荡dp Description 题目背景 Euphemia\texttt{Euphemia}Euphemia 到一个 N×NN\times NN×N 的药草田里采药,她从左上角的 ...
- python猜数游戏流程_python简单猜数游戏实例
本文实例讲述了python简单猜数游戏.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import random number = random.randint ...
- [XSY] 简单的数论题(数学、构造)
简单的数论题 m(a3+b3)=n(c3+d3)m(a^3+b^3)=n(c^3+d^3)m(a3+b3)=n(c3+d3) 考虑因式分解(a3+b3),(c3+d3):考虑因式分解(a^3+b^3) ...
- CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》
金色十月线上编程比赛第一题:小女孩数数 题目详情: [金色十月线上编程比赛规则] 一个小女孩正在用左手手指数数,从1数到n.她从拇指算作1开始数起,然后,食指为2,中指为3,无名指为4,小指为5.接下 ...
- js设计一个带开关的时钟_数电题:三个按键一个灯
有这样一道数电题: 一个LED发光二极管由A.B.C三个独立按键控制,要求按压A.B.C三个按键中的任意一个都能对LED实现亮.灭控制(即每按压一次按键,LED发光状态改变一次).请用D触发器或JK触 ...
最新文章
- Python让你成为AI 绘画大师,简直太惊艳了!(附代码))
- mysql 22001_mysql ERROR 1264 (22003): Out of range value for column 'x' at row 1 错误
- 数据与程序分离——程序中那些表的事儿
- VTK:结构化网格之GetLinearPointId
- session and cookie
- g4e基础篇#4 了解Git存储库(Repo)
- [html] html5的游戏引擎你了解多少?都有哪些比较好用的引擎呢?
- 11--移除重复节点
- 【转载】如何把Mysql5.5数据库的数据导入到MSSql 数据库中【mysql-connector-odbc-3.51.28-win32】...
- GFP_KERNEL的作用
- 【渝粤教育】国家开放大学2018年秋季 0689-22T老年心理健康 参考试题
- 选择排序的时间复杂度
- 中职“网络班级”中家校沟通模块的应用实践
- nginx防盗链配置
- 国庆长假来啦!这些消遣目的地最适合程序员
- 【洛谷P1903】数颜色
- 深入浅出零知识证明(二):zkSNARKs基本原理
- ROBOMASTER比赛作品集_邹俊添
- 基于 Prometheus 的边缘计算监控实践
- do-while语句使用案例
热门文章
- linux挂载4t硬盘用不了,centos7挂载新加4T硬盘到/home目录
- java和python哪个学习编程_初学编程,选Java还是Python?
- python 数据驱动接口自动化框架_python接口自动化测试 - 数据驱动DDT模块的简单使用...
- 信号与系统matlab课设报告,MATLAB信号与系统实验报告
- c#程序设计教程 唐大仕pdf_C# 添加PDF水印
- php转译html,使用php转义输出HTML到JavaScript
- tutte定理证明hall定理_人教社课本现低级错误?“爱因斯坦用相对论证明勾股定理”...
- cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程
- php oracle 锁表,ORACLE 用户锁定问题
- leetcode337. 打家劫舍 III