牛客 智乃与无意义的题目 ###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 }

浙公网安备 33010602011771号