Hamster’s Sequence(前缀和 思维)
阅读原文时间:2021年04月26日阅读:1

题目描述
WCQ is a very cute hamster.
He is interested in the number of factors of a number. One day his master WK gave him a sequence (a1, a2, …an) and m queries. For each query, WCQ will be given two integers l, r. He has to calculate the number of factors of .
As the cleverest hamster, he finds this problem very easy to handle,so he decides to ask you the same question.

输入
The first line contains two integers n and m (1 ≤ n, m ≤ 100000)—the sequence length and the number of questions.
The second line contains n integers a1, a2,…, an(1 ≤ ai ≤ 231 − 1)—the sequence.All the ai are generated by rand() ∗ rand(), where max { rand() } = 32767.
The next m line each line contains two integers l, r(1 ≤ l, r ≤ n), representing the queries.

输出
Print m integers ,ith of them is the answer to the ith query.
The answer should be mod 35808247, and 35808247=5981 × 5987.

样例输入
5 5
1 2 3 4 5
1 1
2 2
3 3
1 5
4 5

样例输出
1
2
2
16
6

思路
由于该序列的数都是由rand()函数构造而成,因此只需要通过求该序列质因数的个数,即可得到答案

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int>P;
const int N =1e5+5;
const int maxn=32767;
const ll mod = 35808247;
int cnt;
bool vis[N];
int prime[N];

void getprime()
{
    for(int i=2;i<=maxn;i++)
    {
        if(!vis[i]) prime[cnt++]=i;
        for(int j=0;j<cnt && i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
}
ll ans[N],sum[N];
int a[N];
int n,m;
P ques[N];
void getq(int p)
{
    for(int i=1;i<=n;i++)
    {
        int temp=a[i];
        int tot=0;
        while(temp%prime[p]==0)
        {
            tot++;
            temp/=prime[p];
        }
        sum[i]=sum[i-1]+tot;
    }
    for(int i=1;i<=m;i++)
    {
        ll tmp=sum[ques[i].second]-sum[ques[i].first-1]+1;
        ans[i]=ans[i]*tmp%mod;
    }
}
int main()
{
    getprime();
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        ans[i]=1;
    }
    for(int i=1;i<=m;i++) scanf("%d%d",&ques[i].first,&ques[i].second);
    for(int i=0;i<cnt;i++) getq(i);
    for(int i=1;i<=m;i++) printf("%lld\n",ans[i]%mod);
    return 0;
}