正题


题目大意

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】相关推荐

  1. 数数题(计数类 DP)做题记录

    数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...

  2. 【XSY3952】简单的计数题(dp)

    题面 简单的计数题 题解 首先题意可以转化为:给你一个长度为 nnn 的序列 ccc,求将 ccc 分成两个长度为 n2\dfrac{n}{2}2n​ 的相同的子序列的方案数. 考虑 dp,设 f(i ...

  3. [XSY] 简单的博弈题(博弈+dp+组合数+容斥)

    简单的博弈题 对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜.(这不就是田忌赛马吗) 对于随机的对手,先考虑暴力怎么做: void check(int x,int w){if(x> ...

  4. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 682  Solved: 364 Description 我们称 ...

  5. 洛谷2657 windy数(数位DP)

    传送门 [题目分析] 数位DP经典题了. 考虑直接统计R内的windy数和L-1内的windy数,两者相减即为L~R之间的windy数. 考虑DP,记录当前位以及上一位所填的数,当前是否前面为前导零, ...

  6. 题解-路径数+算法-回荡dp

    题解-路径数+算法-回荡dp Description 题目背景 Euphemia\texttt{Euphemia}Euphemia 到一个 N×NN\times NN×N 的药草田里采药,她从左上角的 ...

  7. python猜数游戏流程_python简单猜数游戏实例

    本文实例讲述了python简单猜数游戏.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import random number = random.randint ...

  8. [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) ...

  9. CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》

    金色十月线上编程比赛第一题:小女孩数数 题目详情: [金色十月线上编程比赛规则] 一个小女孩正在用左手手指数数,从1数到n.她从拇指算作1开始数起,然后,食指为2,中指为3,无名指为4,小指为5.接下 ...

  10. js设计一个带开关的时钟_数电题:三个按键一个灯

    有这样一道数电题: 一个LED发光二极管由A.B.C三个独立按键控制,要求按压A.B.C三个按键中的任意一个都能对LED实现亮.灭控制(即每按压一次按键,LED发光状态改变一次).请用D触发器或JK触 ...

最新文章

  1. Python让你成为AI 绘画大师,简直太惊艳了!(附代码))
  2. mysql 22001_mysql ERROR 1264 (22003): Out of range value for column 'x' at row 1 错误
  3. 数据与程序分离——程序中那些表的事儿
  4. VTK:结构化网格之GetLinearPointId
  5. session and cookie
  6. g4e基础篇#4 了解Git存储库(Repo)
  7. [html] html5的游戏引擎你了解多少?都有哪些比较好用的引擎呢?
  8. 11--移除重复节点
  9. 【转载】如何把Mysql5.5数据库的数据导入到MSSql 数据库中【mysql-connector-odbc-3.51.28-win32】...
  10. GFP_KERNEL的作用
  11. 【渝粤教育】国家开放大学2018年秋季 0689-22T老年心理健康 参考试题
  12. 选择排序的时间复杂度
  13. 中职“网络班级”中家校沟通模块的应用实践
  14. nginx防盗链配置
  15. 国庆长假来啦!这些消遣目的地最适合程序员
  16. 【洛谷P1903】数颜色
  17. 深入浅出零知识证明(二):zkSNARKs基本原理
  18. ROBOMASTER比赛作品集_邹俊添
  19. 基于 Prometheus 的边缘计算监控实践
  20. do-while语句使用案例

热门文章

  1. linux挂载4t硬盘用不了,centos7挂载新加4T硬盘到/home目录
  2. java和python哪个学习编程_初学编程,选Java还是Python?
  3. python 数据驱动接口自动化框架_python接口自动化测试 - 数据驱动DDT模块的简单使用...
  4. 信号与系统matlab课设报告,MATLAB信号与系统实验报告
  5. c#程序设计教程 唐大仕pdf_C# 添加PDF水印
  6. php转译html,使用php转义输出HTML到JavaScript
  7. tutte定理证明hall定理_人教社课本现低级错误?“爱因斯坦用相对论证明勾股定理”...
  8. cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程
  9. php oracle 锁表,ORACLE 用户锁定问题
  10. leetcode337. 打家劫舍 III