Luogu P1356 数列的整数性题解

Posted chloristendika

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1356 数列的整数性题解相关的知识,希望对你有一定的参考价值。

对于什么模什么整除之类的DP题我总是很慌张

但是像我这种蒟蒻都过了这道题是不是?

对于这种能否整除的DP题目,我们只需要考虑前i个数通过一定的组合,mod k 能否 == j,
这就是我们要写的`状态`

bool f[i][j]表示能否通过一定的组合将前i个数 mod k = j;

显而易见,最后的答案是能否通过一定的组合将前n个数 mod k = 0
也就是f[n][0]是否为true;

当状态为f[i][j]时,若状态f[i][(j +- a[i] % k + k) % k] 为true,则f[i][j]也一定为true;+-里只要满足一个就可以了,所以要用||符号

最后头疼的是边界条件,卡了我很久

f[1][(a[1] % k + k) % k] = f[1][(-a[1] % k + k) % k] = true;

#include <bits/stdc++.h>
using namespace std;

int t,n,k;
bool f[10000 + 10][100 + 10];
int a[10000 + 10];

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        memset(f,0,sizeof(f));
        for(int i = 1;i <= n; i++) scanf("%d",&a[i]);
        f[0][0] = 1;
        f[1][(a[1] % k + k) % k] = f[1][(-a[1] % k + k) % k] = true;
        for(int i = 2;i <= n; i++){
            for(int j = 0;j < k; j++){
                f[i][j] = (f[i - 1][((j + a[i] % k) + k) % k]) || (f[i - 1][(j - a[i] % k + k) % k]);
            }
        }
        printf("%s
",f[n][0] == 1 ? "Divisible" : "Not divisible");
    }
    return 0;
}

  



以上是关于Luogu P1356 数列的整数性题解的主要内容,如果未能解决你的问题,请参考以下文章

P1356 数列的整除性 递推,丝毫没dp的感觉

P4552题解

luogu2858奶牛零食题解--区间DP

luogu P1939 模板矩阵加速(数列) 题解

luogu P3901 数列找不同 题解

题解Luogu P3901 数列找不同