您的位置:首页 > 其它

[多状态动态规划] 表达式整除

2017-07-31 10:53 246 查看
NOIP模拟 表达式整除

2017年7月31日

DP

描述 Description

24点这个游戏好多人都玩过,就是给你4个数,添加相应的运算符,是否可以得到结果是24.

小x在玩了很多遍这个游戏之后,想把这个游戏给改变一下。 给你n个整数,在n个整数间,只能添加+和- 两种运算符。

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

现在的问题是:给你n个数,能够构成一个表达式,让这个表达式的值能被某个给定的数整除。 上面的例子中:可以被7整除,但是不能被5整除。

输入格式 Input Format

第一行一个整数,表示有k组测试数据。 接下来对于每组测试数据有两行:

第一行是两个整数n和x(1<=n<=10000, 2<=x<=100), n 表示数列中整数的个数;x就是需要你判断的这个数列是否能被x整除。

输出格式 Output Format

包含k行,每行表示一组数据的结果。 如果能被x整除,输出”Divisible”,如果不能,则输出 “Not divisible”

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

int K;
int F[11000];
bool E[11000][300];//1-100:负余数

inline int Reminder(int a, int mod)
{
if(abs(a) < mod)    return (a + 100);
return ((a - (a / mod) * mod) + 100);
}

void RunFunction()
{
int N, x;
cin >> N >> x;
memset(E, false, sizeof(E));
for(int i = 1; i <= N; i++)    cin >> F[i];
E[1][Reminder(F[1], x)] = true;
for(int i = 2; i <= N; i++)
for(int k = 1; k <= 210; k++)
if(E[i - 1][k] == true){
E[i][Reminder((k - 100 + F[i]), x)] = true;
E[i][Reminder((k - 100 - F[i]), x)] = true;
}
if(E
[100] == true)   cout << "Divisible" << endl;
else                    cout << "Not divisible" << endl;
}

int main()
{
cin >> K;
for(int i = 1; i <= K; i++)
RunFunction();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: