http://www.tsinsen.com/ViewGProblem.page?gpid=A1339

题解:https://blog.csdn.net/LOI_DQS/article/details/51251737

对着题解A掉了。。。然而并不知道为什么要这么转化问题。。。

复杂度nlog^2n级别吧

 #include<cstdio>
#include<algorithm>
#include<map>
#include<cmath>
#define fi first
#define se second
#define md 1000000007
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
int a[],d[],nxt[],pos[],len;
bool vis[];
int prime[];
bool fir[];
void dprime(int x,map<int,int> &ma)
{
ma.clear();
if(x<=) return;
int i,end=floor(sqrt(x+0.5));
for(i=;prime[i]<=end;i++)
while(x!=prime[i])
{
if(x%prime[i]==)
{
ma[prime[i]]++;
x/=prime[i];
}
else
break;
}
ma[x]++;
}
int n,qq;
namespace S
{
#define mid (l+((r-l)>>1))
#define lc (num<<1)
#define rc (num<<1|1)
int dat[];
void build(int l,int r,int num)
{
if(l==r){dat[num]=fir[l]?d[l]:;return;}
build(l,mid,lc);build(mid+,r,rc);
dat[num]=LL(dat[lc])*dat[rc]%md;
}
int L,R,x;
void upd(int l,int r,int num)
{
if(l==r) {dat[num]=x;return;}
if(L<=mid) upd(l,mid,lc);
else upd(mid+,r,rc);
dat[num]=LL(dat[lc])*dat[rc]%md;
}
int que(int l,int r,int num)
{
if(L<=l&&r<=R) return dat[num];
int ans=;
if(L<=mid) ans=LL(ans)*que(l,mid,lc)%md;
if(mid<R) ans=LL(ans)*que(mid+,r,rc)%md;
return ans;
}
#undef mid
#undef lc
#undef rc
}
int poww(int a,int b)
{
LL ans=,base=a;
for(;b;base=base*base%md,b>>=)
if(b&)
ans=ans*base%md;
return ans;
}
struct Q
{
int l,r,num,ans;
}q[];
bool operator<(const Q &a,const Q &b) {return a.l<b.l||(a.l==b.l&&a.r<b.r);}
bool cmp(const Q &a,const Q &b) {return a.num<b.num;}
int main()
{
int i,j,t;map<int,int> tans;
map<int,int>::iterator it;
for(i=;i<=;i++)
{
if(!vis[i]) prime[++prime[]]=i;
for(j=;j<=prime[]&&i*prime[j]<=;j++)
{
vis[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
scanf("%d%d",&n,&qq);
for(i=;i<=n;i++)
{
scanf("%d",&t);dprime(t,tans);
for(it=tans.begin();it!=tans.end();it++)
for(j=;j<=it->second;j++)
++len,a[len]=poww(it->first,j),d[len]=it->first;
pos[i]=len;
}
tans.clear();
for(i=;i<=len;i++)
{
if(!tans[a[i]]) fir[i]=;
else nxt[tans[a[i]]]=i;
tans[a[i]]=i;
}
S::build(,len,);
for(i=;i<=qq;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].num=i,q[i].l=pos[q[i].l-]+,q[i].r=pos[q[i].r];
sort(q+,q+qq+);
for(i=,j=;i<=qq;i++)
{
for(;j<q[i].l;)
{
if(nxt[j])
{
S::L=nxt[j];S::x=d[nxt[j]];S::upd(,len,);
}
++j;
}
S::L=q[i].l;S::R=q[i].r;
q[i].ans=S::que(,len,);
}
sort(q+,q+qq+,cmp);
for(i=;i<=qq;i++) printf("%d\n",q[i].ans);
return ;
}

最新文章

  1. Asp.NET + SQLServer 部署注意事项
  2. webView 自适应高度 document.body 属性
  3. Reflection应用场景-利用反射机制将表单数据自动填充到JavaBean中
  4. 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.
  5. Linux常用目录
  6. [转]响应式WEB设计学习(3)—如何改善移动设备网页的性能
  7. codeforces 425C
  8. VPS常用工具
  9. awk处理之案例二:awk匹配文本
  10. Tabbar视图切换,返回上一视图,添加item
  11. vijos1101题解
  12. jQuery遍历table中的tr td并获取td中的值
  13. JavaScript面向对象--封装
  14. JDK设计模式之—单例模式和static关键字
  15. 第一册:lesson thirteen.
  16. element-ui的table动态生成表头和数据,且表中数据可编辑
  17. go标准库的学习-os
  18. parseInt转换
  19. Java+Selenium如何解决空指针
  20. 笔记:pycharm 快捷键

热门文章

  1. python使用cx_oracle连接oracle数据库
  2. Hibernate_14_数据连接池的使用
  3. css3某些特性
  4. hdu-5120 Intersection(计算几何)
  5. CollectionView垂直缩放卡片布局
  6. 安装Sublime Text 3插件的方法(转自Rising的博文)
  7. 哈希表的C实现(二)
  8. vue 随笔3
  9. 插入符的创建(MFC)
  10. 修改CentOS系统的默认启动级别