牛牛想起飞
用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;
}
}
}
京公网安备 11010502036488号