[Luogu5190][COCI2010]PROGRAM

题目链接:

Luogu5190

一个简单的优化:把相同的\(X_i\)放在一起操作。

那么时间复杂度就是\(\sum_{i=1}^n\limits \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\n",s[r+1]-s[l]);
    return 0;
}
posted @ 2019-02-13 15:53  LanrTabe  阅读(103)  评论(0编辑  收藏  举报