Description Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmetical expressions that evaluate to different values. Let us, for example, take the sequence: 17, 5, -21, 15. There are eight possible expressions: 17 + 5 + -21 + 15 = 16 Input The first line of the input file contains two integers, N and K (1 <= N <= 10000, 2 <= K <= 100) separated by a space. Output Write to the output file the word "Divisible" if given sequence of integers is divisible by K or "Not divisible" if it's not. Sample Input Sample Output Source |
[Submit] [Go Back] [Status] [Discuss]
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
给出数据任意加减问是否能整除K
dp[i][j]代表选i个数,余数是否为j,为j则值为1,否则为0。
如果dpi-1j为1,那么
dp[i][(j+s[i])%k]=1; dp[i][((j-s[i])%k+k)%k]=1;肯定也是1!
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10005
int s[maxn];
int dp[maxn][106];
int main()
{
int n,k;
while(cin>>n>>k)
{
for(int i=0;i<n;i++)
{
cin>>s[i];
s[i]=(int)abs(s[i])%k;
}
memset(dp,0,sizeof(dp));
dp[0][s[0]]=1;//选0个数余数为s[0]
for(int i=1;i<n;i++)
{
for(int j=k-1;j>=0;j--)
{
if(dp[i-1][j])
{
dp[i][(j+s[i])%k]=1;
dp[i][((j-s[i])%k+k)%k]=1;
}
}
}
if(dp[n-1][0])
{
cout<<"Divisible"<<endl;
}else
{
cout<<"Not divisible"<<endl;
}
}
}