Comet OJ - 模拟赛 #2 A

传送门

样例输入 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);
		}
	}
}
发布了340 篇原创文章 · 获赞 128 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/king9666/article/details/104228112