• 判断整除


    判断整除

    链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1195


    时间限制: 1000 ms         内存限制: 65536 KB

    【题目描述】

    一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列:1、2、4共有8种可能的序列:

    (+1) + (+2) + (+4) = 7

    (+1) + (+2) + (-4) = -1

    (+1) + (-2) + (+4) = 3

    (+1) + (-2) + (-4) = -5

    (-1) + (+2) + (+4) = 5

    (-1) + (+2) + (-4) = -3

    (-1) + (-2) + (+4) = 1

    (-1) + (-2) + (-4) = -7

    所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、-3、-6、-9……都可以认为是3的倍数。

    【输入】

    输入的第一行包含两个数:N(2<N<10000)和k(2<k<100),其中N代表一共有N个数,k代表被除数。第二行给出序列中的N个整数,这些整数的取值范围都0到10000之间(可能重复)。

    【输出】

    如果此正整数序列可被k整除,则输出YES,否则输出NO。(注意:都是大写字母)

    【输入样例】

    3 2
    1 2 4
    题解:利用公式(a*b)%c == ((a%c)*(b%c))%c,f[i][j]表示到第i个数的余数是否可为j,只要f[n][0]=1即成立;
    对于f[1]只考虑一种分式,因为整体乘-1即可得到另一种,见样例
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    bool f[10005][205];
    int a[10005];
    int main()
    {
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)cin>>a[i];
        f[1][(a[1]%k+k)%k]=1;
        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]);
        }
        if(f[n][0])cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
  • 相关阅读:
    typescript
    js-解决安卓手机软键盘弹出后,固定定位布局被顶上移问题
    vue
    js
    Object.assgin基本知识与相关深浅拷贝
    js-工具方法(持续更新)
    vue
    vue
    git
    css
  • 原文地址:https://www.cnblogs.com/EdSheeran/p/7709864.html
Copyright © 2020-2023  润新知