题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085
题意:存在两个长度为n,m的数组A,B。有q个询问,每个询问有一个数字k,可以得到Ai%Bj=k的种数,求种数。
解法:打表出所有查询k,k<Bi,从最大的Bi开始枚举。如果a%b==k,那么(a-k)%b==0,考虑用bitset来加速,复杂度O(n*n/32*5),要想跑得最快需要手写bitset。
#include <bits/stdc++.h> using namespace std; const int maxn = 50005; bitset <maxn> b1, b2; int b[maxn], ans[maxn]; int main() { int T; scanf("%d", &T); while(T--) { b1.reset(); b2.reset(); int n,m,k,x; scanf("%d%d%d",&n,&m,&k); int mx=-1; for(int i=0; i<n; i++) scanf("%d", &x), b1.set(x); for(int i=0; i<m; i++) scanf("%d", &b[i]), mx = max(mx, b[i]); sort(b,b+m); int cnt=m-1; for(int i=mx; i>=0; i--){ ans[i]=((b2<<i)&b1).count()&1; if(b[cnt]>=i&&cnt>=0){ for(int j=0; j<=mx; j+=b[cnt]){ b2.flip(j); } cnt--; } } for(int i=0; i<k; i++){ int x; scanf("%d", &x); printf("%d ", ans[x]); } } return 0; }