• 清橙A1339. JZPLCM(顾昱洲)


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

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

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

    复杂度nlog^2n级别吧

      1 #include<cstdio>
      2 #include<algorithm>
      3 #include<map>
      4 #include<cmath>
      5 #define fi first
      6 #define se second
      7 #define md 1000000007
      8 using namespace std;
      9 typedef long long LL;
     10 typedef pair<int,int> P;
     11 int a[1700100],d[1700100],nxt[1700100],pos[100100],len;
     12 bool vis[50100];
     13 int prime[20100];
     14 bool fir[1700100];
     15 void dprime(int x,map<int,int> &ma)
     16 {
     17     ma.clear();
     18     if(x<=1)    return;
     19     int i,end=floor(sqrt(x+0.5));
     20     for(i=1;prime[i]<=end;i++)
     21         while(x!=prime[i])
     22         {
     23             if(x%prime[i]==0)
     24             {
     25                 ma[prime[i]]++;
     26                 x/=prime[i];
     27             }
     28             else
     29                 break;
     30         }
     31     ma[x]++;
     32 }
     33 int n,qq;
     34 namespace S
     35 {
     36 #define mid (l+((r-l)>>1))
     37 #define lc (num<<1)
     38 #define rc (num<<1|1)
     39 int dat[40000000];
     40 void build(int l,int r,int num)
     41 {
     42     if(l==r){dat[num]=fir[l]?d[l]:1;return;}
     43     build(l,mid,lc);build(mid+1,r,rc);
     44     dat[num]=LL(dat[lc])*dat[rc]%md;
     45 }
     46 int L,R,x;
     47 void upd(int l,int r,int num)
     48 {
     49     if(l==r)    {dat[num]=x;return;}
     50     if(L<=mid)    upd(l,mid,lc);
     51     else    upd(mid+1,r,rc);
     52     dat[num]=LL(dat[lc])*dat[rc]%md;
     53 }
     54 int que(int l,int r,int num)
     55 {
     56     if(L<=l&&r<=R)    return dat[num];
     57     int ans=1;
     58     if(L<=mid)    ans=LL(ans)*que(l,mid,lc)%md;
     59     if(mid<R)    ans=LL(ans)*que(mid+1,r,rc)%md;
     60     return ans;
     61 }
     62 #undef mid
     63 #undef lc
     64 #undef rc
     65 }
     66 int poww(int a,int b)
     67 {
     68     LL ans=1,base=a;
     69     for(;b;base=base*base%md,b>>=1)
     70         if(b&1)
     71             ans=ans*base%md;
     72     return ans;
     73 }
     74 struct Q
     75 {
     76     int l,r,num,ans;
     77 }q[100100];
     78 bool operator<(const Q &a,const Q &b)    {return a.l<b.l||(a.l==b.l&&a.r<b.r);}
     79 bool cmp(const Q &a,const Q &b)    {return a.num<b.num;}
     80 int main()
     81 {
     82     int i,j,t;map<int,int> tans;
     83     map<int,int>::iterator it;
     84     for(i=2;i<=50000;i++)
     85     {
     86         if(!vis[i]) prime[++prime[0]]=i;
     87         for(j=1;j<=prime[0]&&i*prime[j]<=50000;j++)
     88         {
     89             vis[i*prime[j]]=1;
     90             if(i%prime[j]==0)    break;
     91         }
     92     }
     93     scanf("%d%d",&n,&qq);
     94     for(i=1;i<=n;i++)
     95     {
     96         scanf("%d",&t);dprime(t,tans);
     97         for(it=tans.begin();it!=tans.end();it++)
     98             for(j=1;j<=it->second;j++)
     99                 ++len,a[len]=poww(it->first,j),d[len]=it->first;
    100         pos[i]=len;
    101     }
    102     tans.clear();
    103     for(i=1;i<=len;i++)
    104     {
    105         if(!tans[a[i]])    fir[i]=1;
    106         else    nxt[tans[a[i]]]=i;
    107         tans[a[i]]=i;
    108     }
    109     S::build(1,len,1);
    110     for(i=1;i<=qq;i++)    scanf("%d%d",&q[i].l,&q[i].r),q[i].num=i,q[i].l=pos[q[i].l-1]+1,q[i].r=pos[q[i].r];
    111     sort(q+1,q+qq+1);
    112     for(i=1,j=1;i<=qq;i++)
    113     {
    114         for(;j<q[i].l;)
    115         {
    116             if(nxt[j])
    117             {
    118                 S::L=nxt[j];S::x=d[nxt[j]];S::upd(1,len,1);
    119             }
    120             ++j;
    121         }
    122         S::L=q[i].l;S::R=q[i].r;
    123         q[i].ans=S::que(1,len,1);
    124     }
    125     sort(q+1,q+qq+1,cmp);
    126     for(i=1;i<=qq;i++)    printf("%d
    ",q[i].ans);
    127     return 0;
    128 }
  • 相关阅读:
    16.检查是否为BST
    15.输出单层结点
    14.高度最小的BST
    *13.有向路径检查
    12.二叉树平衡检查
    11.双栈排序
    10.回文链表
    9.链式A+B
    8.链表分割
    7.访问单个节点的删除
  • 原文地址:https://www.cnblogs.com/hehe54321/p/9026800.html
Copyright © 2020-2023  润新知