刷题清橙 A1339 JZPLCM(顾昱洲)
Posted hongyj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题清橙 A1339 JZPLCM(顾昱洲)相关的知识,希望对你有一定的参考价值。
试题来源
2012中国国家集训队命题答辩
问题描述
给定一长度为n的正整数序列a,有q次询问,每次询问一段区间内所有数的lcm(即最小公倍数)。由于答案可能很大,输出答案模1000000007。
输入格式
第一行,两个整数,n, q,分别表示数列长度和询问个数。
下面n行,每行一个整数,第i行的整数为ai。
下面q行,每行两个整数l, r,表示询问下标i在[l, r]范围内的ai的lcm。
输出格式
q行。对于每个询问,输出一行,表示对应的答案。
样例输入
3 3
123
234
345
1 2
2 3
1 3
样例输出
9594
26910
1103310
样例说明
我们用1和2来分别表示两种颜色的宝石,则这串项链有四种等概率的情形:1121,1122,1221和1222。它们的幸运度分别是2,2,2,3,因此期望的幸运度是2.25。
数据规模和约定
测试数据编号 | 规模和约定 |
1, 2 | n, q<=1000 |
3, 4 | n, q<=5000 |
5, 6 | n, q<=20000 |
7, 8 | n, q<=30000 |
9, 10 | n, q<=40000 |
11, 12 | n, q<=50000 |
13, 14 | n, q<=80000 |
15, 16 | n, q<=100000 |
17, 18, 19, 20 | n, q<=100000 数列a中每个数能表示为不超过100的素数的积 |
对于所有测试点,数列a中每个数满足1<=ai<=1000000000。
题解
求一个区间的 (lcm) ,将区间中所有数进行质因数分解,(lcm) 就是区间中所有质因数在最大幂次的情况下的乘积
询问离线
将所有数的每个质因子拆成 (p_i^1,p_i^2,p_i^3,...,p_i^{k_i}) 物品,用BIT维护区间内最大幂次就好了
#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,Mod=1e9+7;
int n,q,pt,cnt,prime[MAXN],vis[MAXN];
ll ans[MAXN];
std::map<int,int> M;
struct node{
int id,val,num,las;
};
node p[MAXN*35];
struct question{
int id,l,r;
inline bool operator < (const question &A) const {
return r<A.r||(r==A.r&&l<A.l);
};
inline bool operator > (const question &A) const {
return id<A.id;
};
};
question query[MAXN];
struct BIT{
ll C[MAXN];
inline void init()
{
for(register int i=1;i<=n;++i)C[i]=1;
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,ll k)
{
if(!x)return ;
while(x<=n)C[x]=1ll*C[x]*k%Mod,x+=lowbit(x);
}
inline ll mul(int x)
{
ll res=1;
while(x>0)res=1ll*res*C[x]%Mod,x-=lowbit(x);
return res;
}
};
BIT T;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='