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

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[N][100] == true)   cout << "Divisible" << endl;
    else                    cout << "Not divisible" << endl;
}

int main()
{
    cin >> K;
    for(int i = 1; i <= K; i++)
        RunFunction();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值