[51nod1678]
- 考虑容斥:ans=总和 - 下标和i不互质的数的和
- 枚举i的质因数,容斥即可
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=1e6;
int p[N],sum[N],v[N],a[N],b[N],SUM,cnt,op,x,val,m,n,q;
inline int read(){
int num=0;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))num=num*10+ch-'0',ch=getchar();
return num;
}
void euler(int n){
rep(i,2,n){
if(!v[i]){
v[i]=i;
p[++m]=i;
}
rep(j,1,m){
if(p[j]>v[i]||1LL*i*p[j]>n)break;
v[i*p[j]]=p[j];
}
}
}
int main()
{
//freopen("a.in","r",stdin);
n=read(),q=read();
euler(n);
rep(i,1,n)a[i]=read(),SUM+=a[i];
rep(i,1,n){
for(int j=i;j<=n;j+=i)sum[i]+=a[j];
}
while(q--){
op=read();
if(op==1){
x=read(),val=read();
rep(i,1,sqrt(x)){
if(x%i)continue;
sum[i]-=a[x];
if(i!=x/i)sum[x/i]-=a[x];
}
SUM-=a[x];
a[x]=val;
SUM+=a[x];
rep(i,1,sqrt(x)){
if(x%i)continue;
sum[i]+=a[x];
if(i!=x/i)sum[x/i]+=a[x];
}
}else{
x=read();
cnt=0; int tmp=x,ans=0;
for(int i=1;p[i]*p[i]<=tmp&&i<=m;i++){
if(tmp%p[i])continue;
while(tmp%p[i]==0)tmp/=p[i];
b[++cnt]=p[i];
}
if(tmp>1)b[++cnt]=tmp;
rep(S,1,(1<<cnt)-1){
int tot=1,num=0,now=1,U=S;
while(U){
if(U&1){
num++;
tot*=b[now];
}
U>>=1,now++;
}
if(num&1)ans+=sum[tot];
else ans-=sum[tot];
}
cout<<SUM-ans<<"\n";
}
}return 0;
}