【题解】选数字 [51nod1354]

传送门:选数字 \([51nod1354]\)

【题目描述】

共 \(T\) 组测试点,每一组给定一个长度为 \(n\) 的序列和一个整数 \(K\),找出有多少子序列满足子序列中所有元素乘积恰好等于K,答案对 \(1e9+7\) 取模。

【样例】

样例输入:
2
3 3
1 1 3
3 6
2 3 6 样例输出:
4
2

【数据范围】

\(100\%\) \(1 \leqslant T \leqslant 20,\) \(1 \leqslant N \leqslant 1000,\) \(2 \leqslant K \leqslant 10^8,\) \(1 \leqslant a[i] \leqslant K\)

【分析】

考虑 \(01\) 背包,用 \(dp[j]\) 表示乘积等于 \(j\) 的子序列数,原序列中的 \(n\) 个数就是 \(n\) 个物品,其数值就是体积。

\(K\) 的范围有 \(10^8\) 辣莫大,但是会对答案造成影响的只有一部分可整除 \(K\) 的数的 \(dp\) 值,所以还可以优化。

为防止爆空间,\(dp\) 数组开 \(map\) 类型,用指针访问,并且保证里面存的决策点都是可以整除 \(K\) 的数,每次要加入新的物品时判断一下,只有当物品体积 \(a\) 和 \(a\) 乘以决策点都可整除 \(K\) 时,才让该物品使用该决策点。

即 \(dp[a*x]+=dp[x](a|K,x|K,a*x|K)\) 。

时间复杂度为 \(O(T*n*p)\),其中 \(p\) 为 \(K\) 的正约数个数。

【Code】

#include<algorithm>
#include<cstdio>
#include<map>
#define Re register int
using namespace std;
const int P=1e9+7;
const int N=1003;
int x,n,K,T,t,o,a;
map<int,int>dp,tmp;
map<int,int>::iterator it;
inline void in(Re &x){
int f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
int main(){
in(T);
while(T--){
in(n),in(K);
dp.clear();
for(Re i=1;i<=n;++i){
in(a);
if(K%a)continue;
tmp=dp;
for(it=tmp.begin();it!=tmp.end();++it)
if(a<=K/(x=it->first)&&K/x%a==0)
(dp[a*x]+=it->second)%=P;
(dp[a]+=1)%=P;
}
printf("%d\n",dp[K]);
}
}

【题解】选数字 [51nod1354]的更多相关文章

  1. 51nod1354 选数字

    01背包tle. 解题报告(by System Message) 类似于背包的DP,以乘积为状态.先把等选数字里面不是K约数的去掉.然后找出K的约数,进行离散化.然后dp[i][j]表示前i个数字乘积 ...

  2. 【题解】数字组合(NTT+组合 滑稽)

    [题解]数字组合(NTT+组合 滑稽) 今天实践一下谢总讲的宰牛刀233,滑稽. \((1+x)(1+x)(1+x)\)的\(x^2\)系数就代表了有三个一快钱硬币构成的两块钱的方案数量. 很好理解, ...

  3. 51 Nod 1354 选数字(体现动态规划的本质)

    1354 选数字  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 当给定一个序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时 ...

  4. Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)

    选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...

  5. 题解-[SDOI2017]数字表格

    题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...

  6. 51nod P1354 选数字 题解

    每日一题 day8 打卡 Analysis 背包+离散化 这题是我们一次模拟赛的T2,结果我的暴力全TLE了. 关键是如果将两个因数的乘积离散化在因数数组中之后等于这个乘积本身,说明a[j]*in离散 ...

  7. 题解 [ZJOI2010]数字计数

    传送门<-洛谷版 电梯<-bzoj版 这份代码是新手友好版,也算是自用版,注释自认为写的很详细. 希望对要学数位dp的人有所帮助 这份题解是记忆化搜索版的数位DP,个人还是比较建议用这种方 ...

  8. 1354 选数字 DP背包 + 数学剪枝

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354&judgeId=187448 其实这题和在若干个数字中,选 ...

  9. BUPT2017 wintertraining(15) #3 题解

    我觉得好多套路我都不会ヘ(;´Д`ヘ) 题解拖到情人节后一天才完成,还有三场没补完,真想打死自己.( ˙-˙ ) A - 温泉旅店 UESTC - 878  题意 ​ 有n张牌,两人都可以从中拿出任意 ...

随机推荐

  1. Android 9.0网络权限适配

    在做Android开发时,使用华为的p20和平板(均为Android 9.0)测试时,发现不能使用WIFI网络,一番郁闷纠结查找后 直接上方法: 在res文件夹下创建xml文件夹,在xml里面创建文件 ...

  2. python中的 dict() 函数

    Python 字典 dict() 函数用于创建一个新的字典,用法与 Pyhon 字典 update() 方法相似. dict() 函数函数语法: dict(key/value) 参数说明: key/v ...

  3. Linux发展史与安装-Linux从入门到精通第一天(非原创)

    文章大纲 一.Linux发展史二.Linux系统的安装三.Linux系统的文件四.学习资料下载五.参考文章   一.Linux发展史 1. Linux前身-Unix 1968年 Multics项目MI ...

  4. ARM开发板上查看动态库或者可执行程序的依赖关系

    以ARM32开发板为例,在/lib下有一个名为ld-linux-armhf.so.3的可执行程序(在ARM64开发板上是/lib/ld-linux-aarch64.so.1),这个程序负责加载可执行程 ...

  5. 工作必备之正则匹配、grep、sed、awk

    常用正则:匹配空行:^\s*\n 匹配www开头:^www 添加行号:awk '$0=""NR". "$0' /etc/yum.conf 1.所有域名前加www ...

  6. QElapsedTimer定时器记录程序执行时间

    QElapedTimer类提供了一种快速计算运行时间的方法,从Qt4.7引入. QElapsedTimer类通常用于快速计算两个事件之间经过了多少时间.它的API与QTime相似,因此可以将正在使用的 ...

  7. Resin开放远程调试端口

    Resin开放远程调试端口在启动加载的resin.xml中,找到  <server-default>, 在其下加入 <jvm-arg>-Xdebug</jvm-arg&g ...

  8. vue-router路由高亮效果

    审查代码,查看激活类名 (1)设置激活类名样式 (2)也可以在路由文件里配置激活类名的别名 (3)配置别名后再次审查,如下所示 此时可以直接配置active类名样式即可 此时便可以实现路由高亮效果 .

  9. @TableName(mybatis-plus中的注解)

    @TableName 描述:表名注解 属性 类型 必须指定 默认值 描述 value String 否 "" 表名 schema String 否 "" sch ...

  10. js面向对象杂谈

    **万丈高楼平地起** 1. 通过命名规范创建具有私有属性的对象: 以__开头的对象为私有对象,但是实际是能访问到的. 2. 通过自执行函数中,return出来一个对象,return旁边的地方都可以写 ...