P1356

数列的整除性

题目描述

对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号 +-,这样就可以构成一个表达式,也就可以计算出表达式的值。对于一个整数数列来说,我们能通过如上的方法构造出不同的表达式,从而得到不同的数值,如果其中某一个数值能够被 \(k\) 整除的话,我们就称该数列能被 \(k\) 整除。现在你的任务是判断某个数列是否能被某数整除。

输入格式

本题有多组数据

第一行一个整数 \(M\),表示数据组数。

对于每组数据:

第一行两个整数 \(n\)\(k\)\(n\) 表示数列中整数的个数。

第二行 \(n\) 个整数,表示输入数列 \(\{a_n\}\)

输出格式

输出应有 \(M\) 行,依次对应输入文件中的 \(M\) 个子任务,若数列能被 \(k\) 整除则输出 Divisible,否则输出 Not divisible ,行首行末应没有空格。

样例 #1

样例输入 #1

2
4 7
17 5 -21 15
4 5
17 5 -21 15

样例输出 #1

Divisible
Not divisible

提示

样例输入输出 1 解释

对于整数数列:\(17,5,-21,-15\),可以构造出 \(8\) 个表达式:

  • \(17+5+(-21)+15=16\)
  • \(17+5+(-21)-15=-14\)
  • \(17+5-(-21)+15=58\)
  • \(17+5-(-21)-15=28\)
  • \(17-5+(-21)+15=6\)
  • \(17-5+(-21)-15=-24\)
  • \(17-5-(-21)+15=48\)
  • \(17-5-(-21)-15=18\)

该数列能被 \(7\) 整除(\(17+5+(-21)-15=-14\)),但不能被 \(5\) 整除。

数据规模与约定

对于全部的测试点,保证 \(1 \le n \le 10^4,2 \le k \le 100,\left| a_i \right| \le 10^4\)

bool DP即可
注意取模时要 (_%k+k)%k 防止取模出现负数的情况
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t,n,k,a[10005];
bool f[10005][105];
int main()
{
	ios::sync_with_stdio(false);
	cin>>t;
	while(t--)
	{
		memset(f,0,sizeof(f));
		cin>>n>>k;
		for(int i=1;i<=n;i++)cin>>a[i];
		f[1][(a[1]%k+k)%k]=1;
		for(int i=2;i<=n;i++)
			for(int j=0;j<=k-1;j++)
			{
				if(f[i-1][j])
				{
					f[i][((j+a[i])%k+k)%k]=true;
					f[i][((j-a[i])%k+k)%k]=true;
				}
			}
		if(f[n][0])cout<<"Divisible\n";
		else cout<<"Not divisible\n";
	}
}
posted @ 2023-01-10 13:29  PKU_IMCOMING  阅读(33)  评论(0)    收藏  举报