传送门
样例输入 1
5 3
1 2 3 4 5
2 1 5
1 5 2
2 1 5
样例输出 1
15
19
#include<bits/stdc++.h>
#define maxn 100005
#define LL long long
#define S 300
using namespace std;
int n,q;
int pr[maxn],vis[maxn],cnt_pr;
int p[maxn],c[maxn],id[maxn],cnt;
LL a[maxn],sa[maxn/S+1];
void dfs(int u,int x,int y){
if(u==cnt){
a[x]+=y,sa[id[x]]+=y;
return;
}
for(int i=0;i<=c[u] && x<=n;i++,x*=p[u])
dfs(u+1,x,y);
}
int main(){
for(int i=2;i<maxn;i++){
if(!vis[i]) pr[cnt_pr++]=i;
for(int j=0;pr[j]*i<maxn;j++){
vis[i*pr[j]]=1;
if(i%pr[j]==0) break;
}
}
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),id[i]=(i-1)/S,sa[id[i]]+=a[i];
for(int op,x,y;q--;){
scanf("%d%d%d",&op,&x,&y);
if(op == 1){
cnt=0;
for(int i=0;1ll*pr[i]*pr[i]<=x;i++)
if(x%pr[i]==0){
c[cnt] = 0 , p[cnt] = pr[i];
for(;x%pr[i]==0; x/=pr[i]) c[cnt]++;
cnt++;
}
if(x>1) p[cnt]=x,c[cnt++]=1;
dfs(0,1,y);
}
else{
LL ans = 0;
if(id[x] == id[y]){ for(int i=x;i<=y;i++) ans += a[i]; }
else{ for(int i=id[x]+1;i<id[y];i++) ans += sa[i];
for(int i=x;id[i]==id[x];i++) ans += a[i];
for(int i=y;id[i]==id[y];i--) ans += a[i];}
printf("%lld\n",ans);
}
}
}