【题解】选数字 [51nod1354]
【题解】选数字 [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]);}
}
转载于:https://www.cnblogs.com/Xing-Ling/p/11348073.html
【题解】选数字 [51nod1354]相关推荐
- [JS]题解 | #魔法数字#
题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...
- Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)
选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...
- 2020安徽省大学生程序设计大赛题解——A数字排列
2020安徽省大学生程序设计大赛题解--A数字排列 A 数字排列 给出两个整数A 和 B,可以重新排列A 得到新的数字C(不能有前导0).求在小于等于B的情况下,C的最大值是多少.如果不存在输出-1. ...
- 【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记
文章目录 T1:数字游戏 题目 CODE T2:公交换乘 题目 CODE T3:纪念品 题目 题解 CODE T4:加工领奖 题目 题解 CODE 关于普及组的想法&游记 T1:数字游戏 题目 ...
- [2020.11.3NOIP模拟赛]选数字【容斥】
正题 题目链接:https://www.luogu.com.cn/problem/U138404?contestId=36493 题目大意 nnn个数字,每次询问一个区间有多少个三对数或为xxx. 解 ...
- 蓝桥杯青少年创意编程大赛题解:数字组合
题目描述 用户输入一个正整数N(3<=N<=9)N(3<=N<=9)N(3<=N<=9).从 000 到NNN 之间的所有正整数(包含000 和 NNN)中选择三个 ...
- C++题解:数字游戏
题目链接 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按 ...
- 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++
文章目录 第十三届蓝桥杯模拟赛(第三期)试题与题解 1.试题A 题解:数制转换 2.试题B 题解:枚举 3.试题C 题解:枚举 4.试题D 题解:最小生成树 5.试题E 方法一:暴力求和 方法二:一维 ...
- Lintcode18 Subsets II solution 题解
[题目描述] Given a list of numbers that may has duplicate numbers, return all possible subsets Notice:Ea ...
- Leetcode 375. 猜数字大小 II 解题思路及C++实现
方法一:递归 解题思路: 设置一个dp数组,dp[i][j] 表示从数字 i 到 j ,保证猜中所选数字所需的最小花费. 在数字 i 到 j 之间进行猜测时,我们选择数字 i < k < ...
最新文章
- Codeforces-868C. Qualification Rounds(状压)
- mysql check exist_mysql – 使用多个EXIST进行查询
- Hyperledger Fabric 链码(3) 生命周期和API
- 【转】SAP采购订单屏幕增强
- python列表操作程序_Python列表操作,比较常见的10个问题
- layui 开启关闭标签_欧盟发布照明产品ErP及能效标签法规新草案
- python中通过pip安装套件
- 手机通讯加密软件Peerio上架,代码全部开源
- MyBatis映射文件3(参数处理Map)
- ubuntu系统克隆实用教程
- 三星手机PIN码忘记锁机解决方法
- android ndk adk 旧版本下载
- 利用在线词典批量查询英语单词
- “大狼狗加密专家”使用简介
- iOS- 利用UIImageView自己整了个不会说话的汤姆猫
- 戴尔电脑,耳机插入无反应解决办法
- Python实例6: 贺卡制作
- 桂电深信服CTF之MSC真假压缩包
- EasyExcel根据自定义模板导出Excel(包含图片、表格)
- Solid Works 2020打开后显示无法获得下列许可SOLIDWORKS Standard 无法连接到服务器(-15,10,10061)的解决办法
热门文章
- 使用UltraISO刻录自己的音乐CD步骤
- 晴天计算机按键,【图】超实用的ML系列操控快速入门,新手必存(按钮示意图)...
- FF系列重要Staff全列表 (转自天幻网)
- memory prefix hypo,hecto,hyper out1
- Infor LN咨询服务市场报告-行业发展机遇、市场定位及主要驱动因素
- Android开发之渐变效果gradient属性
- matlab 中gradient()函数的用法
- 一枚前端UI组件库 KUI for Vue
- Visual Studio使用技巧 +谷歌浏览器使用技巧总结
- Sentinel-哨兵机制