总时间限制: 1000ms 内存限制: 65536kB
描述
一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列: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

判断整除(动态规划,递推)相关推荐

  1. 矩阵压缩降维动态规划递推【P1719 最大加权矩形】

    矩阵压缩&降维&动态规划&递推[P1719 最大加权矩形] 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要 ...

  2. P1541 乌龟棋 题解(洛谷,动态规划递推)

    题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...

  3. P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...

  4. 数塔(hdoj 2084,动态规划递推)

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  5. 338 比特位计数(动态规划-递推)

    1. 问题描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] ...

  6. 一只小蜜蜂(hdoj 2044,动态规划递推)

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...

  7. 折线分割平面(hdoj 2050,动态规划递推)

    Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...

  8. BNUOJ 4064 条形码设计 (动态规划 + 递推)

    条形码设计 Time Limit: 1000ms                                                    Memory Limit: 65536KB 64 ...

  9. 直线分割平面(动态规划递推)

    在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域. /* 思路: n=1时有两个平面 这时让n=2,多一条直线,这条直线最 ...

最新文章

  1. ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台
  2. LINUX - /etc/init.d/nginx: line 51: kill: (29833) - No such process
  3. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
  4. Xcode统计整个项目代码行数
  5. 开机出现 Invalid Partition Table 怎么办
  6. myeclipse自带tomcat
  7. win10下如何关闭445端口,教程演示
  8. matlab 无刷电机,无刷直流电机MATLAB仿真模型
  9. 血氧仪方案-血氧仪的功能及应用
  10. 使用MATLAB提取图片中特定颜色
  11. Typora+PicGo+阿里云OSS实现云笔记
  12. 如何设置Windowsxp 自动登录
  13. Java图片添加水印功能
  14. Java生成二维码,扫描后跳转到指定的网站
  15. 美国Zaytran夹具/焊接定位器
  16. vue+echarts 区域地图绘制(街道)
  17. python生成静态html_python – 从XML内容生成静态HTML站点
  18. VANCL•凡客诚品
  19. [使用指南] 四个超实用安卓手机使用技巧
  20. 前端实现街道地图_HTML5实现地图上定位导航路线-前端H5/JS/CSS-敏捷大拇指-一个敢保留真话的IT精英社区...

热门文章

  1. Go实现Raft第一篇:介绍
  2. java虚拟机之三--理解Java虚拟机体系结构
  3. Go bufio.Reader 结构+源码详解
  4. JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
  5. Linux日志收集logrotate原理介绍
  6. 通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
  7. kafka可视化客户端工具(Kafka Tool)的使用
  8. Nginx的原理解析
  9. 并发容器(J.U.C)中的集合类
  10. Free Mybatis plugin