题目链接:
一个简单的优化:把相同的(X_i)放在一起操作。
那么时间复杂度就是(sum_{i=1}^nlimits frac ni=O(nlog_2n))(详情百度调和级数)
然后求个前缀和就可以快速回答了。
代码:
#include <cstdio>
#include <cctype>
typedef unsigned long long ull;
inline int Getint()
{
register int x=0,c;
while(!isdigit(c=getchar()));
for(;isdigit(c);c=getchar())x=x*10+(c^48);
return x;
}
int n,k,q;
int c[1000005],a[1000005];
ull s[1000005];
int main()
{
n=Getint(),k=Getint();
for(int i=1;i<=k;++i)++c[Getint()];
for(register int i=1;i<=n;++i)if(c[i])
for(register int j=1;j<=n;j+=i)a[j]+=c[i];
for(register int i=1;i<=n;++i)s[i]=s[i-1]+a[i];
for(register int q=Getint(),l,r;q--;)
l=Getint(),r=Getint(),printf("%llu
",s[r+1]-s[l]);
return 0;
}