P1356 数列的整数性

题目描述

对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值。比如,现在有一个整数数列:17,5,-2,-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

对于一个整数数列来说,我们能通过如上的方法构造出不同的表达式,从而得到不同的数值,如果该数值能够被k整除的话,那么我们就称该数列能被k整除。 在上面的例子中,该数列能被7整除(17+5+(-21)-15=--14),但不能被5整除。现在你的任务是,判断某个数列是否能被某数整除。

输入格式

第一行是一个整数m,表示有m个子任务。接下来就是m个子任务的描述。 每个子任务有两行。第一行是两个整数n和k(1<=n<=10000, 2<=k<=100),n和k中间有一个空格。n 表示数列中整数的个数;k就是需要你判断的这个数列是否能被k 整除。第二行是数列的n个整数,整数间用空格隔开,每个数的绝对值都不超过10000。

输出格式

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

输入输出样例

输入 #1
2

4 7

17 5 -21 15

4 5

17 5 -21 15

输出 #1
Divisible

Not divisible

思路

暴力。。。

正解为数论我们可以用rand随机生成数,来判断是该+还是-,只要多随机几次,就可以AC。。。(自己都不知有多昧良心,暴力还骗分。。。)

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=10010;

int m,n,k,s;
int a[N],j,p;

int main() {
	scanf("%d",&m);
	while(m--) {
		scanf("%d%d",&n,&k);
		for(int i=1; i<=n; i++)
			scanf("%d",&a[i]);
		j=250;
		while(j--) {
			s=0;
			for(int i=1; i<=n; i++) {
				p=rand();
				if(p%2)
					s+=a[i];
				else
					s-=a[i];
			}
			if(!(s%k)) {
				printf("Divisible\n");
				k=0;
				break;
			}
		}
		if(k)
			printf("Not divisible\n");
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11800484.html