P1356 数列的整除性 递推,丝毫没dp的感觉
题意:给出一串数字,让我们在其中加 + - 号,能加n-1个,正负号任意组合
只要其中一个结果能整除k,就输出 可以
全部结果都不能整除,就输出不可以
思路:题意给出的数据范围为n(1e4) k(1e2 )
即要除的数只有100这么大,那么每一次枚举,我们显然可以枚举1到100内的数
只要在当前这个数存在,我们就可以继续枚举
那么复杂度就是100*1e4 可行
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e4+10; 4 int dp[maxn][110]; 5 int a[maxn]; 6 int main() 7 { 8 int T; 9 scanf("%d",&T); 10 while(T--){ 11 memset(dp,0,sizeof(dp)); 12 int n,k; 13 scanf("%d%d",&n,&k); 14 for(int i=1;i<=n;i++){ 15 scanf("%d",&a[i]); 16 a[i]=(a[i]%k+k)%k; 17 } 18 dp[1][a[1]]=1; 19 for(int i=2;i<=n;i++){ 20 for(int j=0;j<=k;j++){ 21 if(dp[i-1][j]){ 22 int tmp1=j+a[i]; 23 tmp1=(tmp1%k+k)%k; 24 dp[i][tmp1]=1; 25 int tmp2=j-a[i]; 26 tmp2=(tmp2%k+k)%k; 27 dp[i][tmp2]=1; 28 } 29 } 30 } 31 if(dp[n][0]) printf("Divisible\n"); 32 else printf("Not divisible\n"); 33 } 34 return 0; 35 }