牛客 智乃与无意义的题目 ###K //K

题目链接:https://ac.nowcoder.com/acm/problem/205837

思路:要的是因子个数,考虑到给的a[i]很小 10 以内的质数只有2 3 5 7 那么考虑将每一个数都质因数分解   

然后最后总的方案数  2的个数+1 * 3的个数+1 *5的个数+1 *7的个数+1    即为总的方案数

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define pb push_back
  5 const int maxn =1e5+10;
  6 const int mod=998244353;
  7 
  8 int a[maxn];
  9 int d[4]={2,3,5,7};
 10 
 11 
 12 struct ac
 13 {
 14     int l,r,num[4];
 15 };
 16 ac tree[maxn*4];
 17 
 18 
 19 
 20 void pushup(int x)
 21 {
 22     for(int i=0;i<4;i++)
 23     {
 24         tree[x].num[i]=tree[x<<1].num[i]+tree[x<<1|1].num[i];
 25     }
 26 }
 27 
 28 
 29 void build(int x,int l,int r)
 30 {
 31     tree[x].l=l,tree[x].r=r;
 32     if(l==r)
 33     {
 34         for(int i=0;i<4;i++)
 35         {
 36             int cnt=0;
 37             while(a[l]%d[i]==0)
 38             {
 39                 a[l]/=d[i];
 40                 cnt++;
 41             }
 42             tree[x].num[i]=cnt;
 43         }
 44     }
 45     else
 46     {
 47         int mid=(l+r)/2;
 48         build(x<<1,l,mid);
 49         build(x<<1|1,mid+1,r);
 50         pushup(x);
 51     }
 52 }
 53 
 54 void update(int x,int pos,int v)
 55 {
 56     int L=tree[x].l,R=tree[x].r;
 57     if(L==R)
 58     {
 59         for(int i=0;i<4;i++)
 60         {
 61             int cnt=0;
 62             while(v%d[i]==0)
 63             {
 64                 v/=d[i];
 65                 cnt++;
 66             }
 67             tree[x].num[i]=cnt;
 68         }
 69     }
 70     else
 71     {
 72         int mid=(L+R)/2;
 73         if(pos<=mid) update(x<<1,pos,v);
 74         if(pos>mid) update(x<<1|1,pos,v);
 75         pushup(x);
 76     }
 77 }
 78 
 79 ac query(int x,int l,int r)
 80 {
 81     int L=tree[x].l,R=tree[x].r;
 82     if(l<=L&&R<=r)
 83     {
 84         return tree[x];
 85     }
 86     else
 87     {
 88         ac ans;
 89         ac temp1;
 90         ac temp2;
 91         for(int i=0;i<4;i++)
 92             ans.num[i]=temp1.num[i]=temp2.num[i]=0;
 93         int mid=(L+R)/2;
 94         if(l<=mid) temp1=query(x<<1,l,r);
 95         if(r>mid) temp2=query(x<<1|1,l,r);
 96         for(int i=0;i<4;i++)
 97         {
 98             ans.num[i]=temp1.num[i]+temp2.num[i];
 99         }
100         return ans;
101 
102     }
103 }
104 
105 
106 
107 
108 int main()
109 {
110     ios::sync_with_stdio(false);
111     cin.tie(0);
112     int n,m;
113     cin>>n>>m;
114 
115     for(int i=1;i<=n;i++)
116     {
117         cin>>a[i];
118     }
119     build(1,1,n);
120     while(m--)
121     {
122         int c;
123         cin>>c;
124         if(c==1)
125         {
126             int p,v;
127             cin>>p>>v;
128             update(1,p,v);
129         }
130         else
131         {
132             int l,r;
133             cin>>l>>r;
134             ac ans=query(1,l,r);
135             ll temp=1;
136             for(int i=0;i<4;i++)
137             {
138                 temp*=ans.num[i]+1;
139                 temp%=mod;
140             }
141             cout<<temp<<'\n';
142         }
143     }
144 
145 
146 
147 }
View Code

 

posted @ 2020-10-16 16:26  canwinfor  阅读(131)  评论(0)    收藏  举报