看了好久的题解,快看的自闭了才看懂(是我太菜了QAQ)
区间取模
[0,m + 1) 区间依次对a1,a2...an取模
一个区间[0,r)的数 mod a[i],
如果r>a[i],那么——
这个区间会变成r/a[i]个[0,a[i])的区间,以及一个[0,r%a[i])的区间
map记录的是区间出现的频率
对于每个Yi,统计Σ(p[xi]) ,xi代表小于Yi的数字,p[xi]代表区间[0,xi)出现的次数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int P = 1e9 + 7;
struct node1
{
ll x,y;
}a[100010];
map<ll,ll>p;
map<ll,ll>::iterator it;
int T;
ll n,m,sum,ans,q;
bool cmp(node1 k,node1 l)
{
return k.x < l.x;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
p.clear();
p[m + 1] = 1;
for(int i = 1;i <= n; ++i)
{
ll x;
scanf("%lld",&x);
while(1)
{
it = p.upper_bound(x);
if(it == p.end()) break;
p[x] += it->first / x * it->second;
if(it->first % x) p[it->first % x] += it->second;
p.erase(it);
}
}
sum = 0;
for(it = p.begin();it != p.end(); ++it)
sum += it->second;
scanf("%lld",&q);
for(int i = 0;i < q; ++i)
{
scanf("%lld",&a[i].x);
a[i].y = (ll)i + 1;
}
sort(a,a + q,cmp);
it = p.begin();
ans = 0;
for(int i = 0;i < q; ++i)
{
while(a[i].x >= it->first)
{
sum -= it->second;
it++;
if(it == p.end()) break;
}
if(it == p.end()) break;
ans = (ans + sum * a[i].y) % P;
}
printf("%lld\n",ans);
}
return 0;
}