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;
}

  

posted on 2011-07-22 19:10  sysu_mjc  阅读(119)  评论(0编辑  收藏  举报

导航