zoukankan      html  css  js  c++  java
  • 【刷题】清橙 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='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline void init()
    {
    	memset(vis,1,sizeof(vis));
    	vis[0]=vis[1]=0;
    	for(register int i=2;i<MAXN;++i)
    	{
    		if(vis[i])prime[++cnt]=i;
    		for(register int j=1;j<=cnt&&i*prime[j]<MAXN;++j)
    		{
    			vis[i*prime[j]]=0;
    			if(i%prime[j]==0)break;
    		}
    	}
    }
    inline void work(int x,int id)
    {
    	for(register int i=1,lt=std::sqrt(x);i<=cnt&&prime[i]<=lt;++i)
    	{
    		int tmp=1;
    		while(x%prime[i]==0)
    		{
    			tmp*=prime[i];
    			p[++pt]=(node){id,prime[i],tmp,0};
    			x/=prime[i];
    		}
    	}
    	if(x!=1)p[++pt]=(node){id,x,x,0};
    }
    inline ll qexp(ll a,ll b)
    {
    	ll res=1;
    	while(b)
    	{
    		if(b&1)res=res*a%Mod;
    		a=a*a%Mod;
    		b>>=1;
    	}
    	return res;
    }
    int main()
    {
    	read(n);read(q);
    	init();T.init();
    	for(register int i=1,x;i<=n;++i)read(x),work(x,i);
    	for(register int i=1;i<=pt;++i)p[i].las=M[p[i].num],M[p[i].num]=p[i].id;
    	for(register int i=1;i<=q;++i)
    	{
    		int l,r;read(l);read(r);
    		query[i]=(question){i,l,r};
    	}
    	std::sort(query+1,query+q+1);
    	for(register int i=1,j=1,k=1;i<=n;++i)
    	{
    		while(j<=pt&&p[j].id==i)T.add(i,p[j].val),T.add(p[j].las,qexp(p[j].val,Mod-2)),++j;
    		while(k<=q&&query[k].r==i)ans[query[k].id]=1ll*T.mul(i)*qexp(T.mul(query[k].l-1),Mod-2)%Mod,++k;
    	}
    	for(register int i=1;i<=q;++i)printf("%lld
    ",ans[i]);
    	return 0;
    }
    
    
  • 相关阅读:
    Django(60)Django内置User模型源码分析及自定义User
    Django(59)验证和授权
    Django(58)viewsets视图集详解
    Django(57)Generic类视图
    正则表达式
    JMeter之检查点(JSON断言)
    JMeter之检查点(响应断言)
    JMeter之参数化(一)
    JMeter之一个简单的性能测试
    JMeter基础
  • 原文地址:https://www.cnblogs.com/hongyj/p/9562901.html
Copyright © 2011-2022 走看看