判断整除(动态规划,递推)
描述
一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列:1、2、4共有8种可能的序列:
(+1) + (+2) + (+4) = 7
(+1) + (+2) + (-4) = -1
(+1) + (-2) + (+4) = 3
(+1) + (-2) + (-4) = -5
(-1) + (+2) + (+4) = 5
(-1) + (+2) + (-4) = -3
(-1) + (-2) + (+4) = 1
(-1) + (-2) + (-4) = -7
所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、-3、-6、-9……都可以认为是3的倍数。
输入的第一行包含两个数:N(2 < N < 10000)和k(2 < k< 100),其中N代表一共有N个数,k代表被除数。第二行给出序列中的N个整数,这些整数的取值范围都0到10000之间(可能重复)。
输出
如果此正整数序列可被k整除,则输出YES,否则输出NO。(注意:都是大写字母)
样例输入
3 2
1 2 4
样例输出
NO
//特别感谢//https://blog.csdn.net/keyword_/article/details/75303893?utm_source=blogxgwz5 #include<bits/stdc++.h> #define ll long long using namespace std; ll f[10001][1001],a[10001]; /* 把数组定义在int main()外面,初始值为0 数组a用来待会存入输入数据 数组f是二元数组,从上往下代表一个个处理a[1],a[2]... 从左到右是和求余(取模)有关,下几行再讲 */ int main() { ///输入环节 ll n,k;cin>>n>>k;for(ll i=1;i<=n;i++)cin>>a[i];///处理环节f[1][a[1]%k]=1;/*首先f[1][...]的1表示正在处理a[1]这个数,然后这里用的是标记法:即符合某个条件就标记为1,所以那个1无计算意义,相当于true,不要纠结它,然后a[1]%k就是a[1]的模啦,所以f数组的意义也就明了了.之所以要定为二元数组而不是一元数组,就是为了从左到右找到一个横轴下标为a[i]的模,然后标记为1,那为什么f数组创建时横轴下标上限为1001而不是无限呢?因为k有范围,而横轴是存模的,一个数%k的取值范围在0到k-1之间,不可能超过k*/for(ll i=2;i<=n;i++)//纵轴从2到n,因为第一个的模已经标记了,所以从2开始for(ll j=0;j<k;j++)//横轴j从0到k-1,因为模不可能超过k//两个for循环遍历f数组,即考虑全部可能/*如果f[i][j]=1,意义则是前i个数总和再去%k的值为j记住这个1意义只是标记而已j是模,如果j被标记为1则说明这个模是成立的,是对的*/if(f[i-1][j]){/*如果前i-1个数总和再%k是j的话(j-a[i])%k是前i个数的模(j+a[i])%k也是前i个数的模,统统标记为1这里分类考虑是因为题目说明了正负情况都要考虑{如果不能理解(a[1]+a[2]+...+a[i])%k==((a[1]+a[2]+...+a[i-1])%k+a[i])%k请学习(同余定理)}*/f[i][((j-a[i])%k+k)%k]=1;f[i][((j+a[i])%k+k)%k]=1;/*那为什么代码写那么复杂,((j-a[i])%k+k)%k,要%那么多次???那是因为j-a[i]可能%k是负数,但是这个数+k肯定大于0然后再%k就是正数了假如不这么做,并且j-a[i]是负数他若是直接%k得到的也是个负模,那数组下标j就撑不住负数了*/} ///输出环节if(f[n][0]) cout<<"yes"<<endl;//0号位为1即模为0else cout<<"no"<<endl;return 0; }
转载于:https://www.cnblogs.com/zyacmer/p/9887215.html
判断整除(动态规划,递推)相关推荐
- 矩阵压缩降维动态规划递推【P1719 最大加权矩形】
矩阵压缩&降维&动态规划&递推[P1719 最大加权矩形] 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要 ...
- P1541 乌龟棋 题解(洛谷,动态规划递推)
题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...
- 数塔(hdoj 2084,动态规划递推)
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...
- 338 比特位计数(动态规划-递推)
1. 问题描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] ...
- 一只小蜜蜂(hdoj 2044,动态规划递推)
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...
- 折线分割平面(hdoj 2050,动态规划递推)
Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...
- BNUOJ 4064 条形码设计 (动态规划 + 递推)
条形码设计 Time Limit: 1000ms Memory Limit: 65536KB 64 ...
- 直线分割平面(动态规划递推)
在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域. /* 思路: n=1时有两个平面 这时让n=2,多一条直线,这条直线最 ...
最新文章
- ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台
- LINUX - /etc/init.d/nginx: line 51: kill: (29833) - No such process
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
- Xcode统计整个项目代码行数
- 开机出现 Invalid Partition Table 怎么办
- myeclipse自带tomcat
- win10下如何关闭445端口,教程演示
- matlab 无刷电机,无刷直流电机MATLAB仿真模型
- 血氧仪方案-血氧仪的功能及应用
- 使用MATLAB提取图片中特定颜色
- Typora+PicGo+阿里云OSS实现云笔记
- 如何设置Windowsxp 自动登录
- Java图片添加水印功能
- Java生成二维码,扫描后跳转到指定的网站
- 美国Zaytran夹具/焊接定位器
- vue+echarts 区域地图绘制(街道)
- python生成静态html_python – 从XML内容生成静态HTML站点
- VANCL•凡客诚品
- [使用指南] 四个超实用安卓手机使用技巧
- 前端实现街道地图_HTML5实现地图上定位导航路线-前端H5/JS/CSS-敏捷大拇指-一个敢保留真话的IT精英社区...