牛牛想起飞
用bitset来记录可以得到的数,然后求得值为1的最高位就是答案

#include <bits/stdc++.h>
using namespace std;
#define Happy return
#define New_Year 0
const int N = 1e5+5;
int a[N],b[N];
bitset<105> bt,z,x;
int main()
{
    int n,y;
    cin>>n>>y;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum=(sum+a[i])%y;
    }
    bt[sum]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        b[i]%=y;
    }

    for(int i=1;i<=n;i++)//枚举序列b中的每一个数
    {
        //加上b[i]
        {
            x = bt<<b[i];
            z = bt>>(y-b[i]);
            x|=z;
            bt|=x;

        }
        //减去b[i]
        {
            x=bt>>b[i];
            z = bt<<(y-b[i]);
            x|=z;
            bt|=x;
        }
    }
    for(int i=y-1;i>=0;i--)//因为是模y意义下的最大值,所以从y-1位开始枚举找值为1的最高位
    {
        if(bt[i]){
            cout<<i<<endl;
            Happy New_Year;
        }
    }
}