题意:给你两个序列,问你第一个序列里的元素是第二个序列里元素的倍数,有多少中组合。
比如:
4
3 4 5 6
4
1 1 2 3
(3,1)两次 (4,1)两次 (5,1)两次 (6,1)两次 (3,3) (4,2) (6,2) (6,3)
12
开两个数组,分别存两个序列的值出现的次数,下标即该数,值为出现次数,然后在遍历第二个数组,如果该数存在,则遍历它的倍数,全部相乘加起来,如果倍数不存在,即为0,0*x = 0;如果存在,相乘即为一共的组合数,加起来ok!有点哈希的思想,剩下的就是暴力了。。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1000005;
ll a[maxn],b[maxn];
ll n,m;
ll sum = 0;
ll an = 0;
ll bn = 0;
int main(){
freopen("deposits.in","r",stdin);
freopen("deposits.out","w",stdout);
while(cin>>n){
sum = 0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
cin>>an;
a[an]++;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>bn;
b[bn]++;
}
for(int i=0;i<maxn;i++){
if(b[i]){
for(int j=1;i*j<maxn;j++){
sum += (a[i*j]*b[i]);
}
}
}
cout<<sum<<endl;
}
return 0;
}