标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11622 | Accepted: 4178 |
Description
Input
Output
Sample Input
4 7 17 5 -21 15
Sample Output
Divisible
思路:定义bool数组dp[10005][105],dp[i][j]表示前i+1个数所形成的和模上k是否为j.状态转移方程:if(dp[i-1][j]){ dp[i][mod(j+a[i],k)]=true;dp[i][mod(j-a[i],k)]=true;}
#include <cstdio> #include <cstring> using namespace std; const int MAXN=10005; bool dp[MAXN][105]; int a[MAXN]; int n,k; int mod(int x,int m) { x%=m; if(x<0) x+=m; return x; } int main() { while(scanf("%d%d",&n,&k)!=EOF) { memset(dp,false,sizeof(dp)); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } dp[0][mod(a[0],k)]=true; for(int i=1;i<n;i++) { for(int j=0;j<k;j++) { if(dp[i-1][j]) { dp[i][mod(j+a[i],k)]=true; dp[i][mod(j-a[i],k)]=true; } } } if(dp[n-1][0]) { printf("Divisible\n"); } else { printf("Not divisible\n"); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5909780.html