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";
}
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号