总时间限制: 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#define ll long longusing 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