poj 1745 Divisibility
#include <iostream> //dp
using namespace std;
long long in[10005],dp[10005][105]; //dp[i][j]表示前i个数的组合 mod k =j 的可能数
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;++i)
{
scanf("%lld",&in[i]); //如果scanf("%d",&in[i]); 会WA
in[i]%=k;
}
dp[1][(in[1]+k)%k]=1;
for(int i=2;i<=n;++i)
for(int j=0;j<k;++j)
{
dp[i][(j+in[i]+k)%k]+=dp[i-1][j];
dp[i][(j-in[i]+k)%k]+=dp[i-1][j];
if(dp[i][(j+in[i]+k)%k]>100000) //原来dp[i][]是会超出long long范围的,WA了n次
dp[i][(j+in[i]+k)%k]-=100000;
if(dp[i][(j-in[i]+k)%k]>100000)
dp[i][(j-in[i]+k)%k]-=100000;
}
if(dp[n][0])
cout<<"Divisible\n";
else
cout<<"Not divisible\n";
return 0;
}