您的位置:首页 > 编程语言 > Java开发

CCF CSP认证 题解:201709-5 除法(Java语言原创)

2018-03-25 11:22 232 查看
问题描述  小葱喜欢除法,所以他给了你N个数a1, a2, ⋯, aN,并且希望你执行M次操作,每次操作可能有以下两种:
  给你三个数l, r, v,你需要将al, al+1, ⋯, ar之间所有v的倍数除以v。
  给你两个数l, r,你需要回答al + al+1 + ⋯ + ar的值是多少。输入格式  第一行两个整数N, M,代表数的个数和操作的次数。
  接下来一行N个整数,代表N个数一开始的值。
  接下来M行,每行代表依次操作。每行开始有一个整数opt。如果opt=1,那么接下来有三个数l, r, v,代表这次操作需要将第l个数到第r个数中v的倍数除以v;如果opt = 2,那么接下来有两个数l, r,代表你需要回答第l个数到第r个数的和。输出格式  对于每一次的第二种操作,输出一行代表这次操作所询问的值。样例输入5 3
1 2 3 4 5
2 1 5
1 1 3 2
2 1 5样例输出15
14

这题用java很轻松AC,除了要加if(b3==1)continue;之类的小优化外没用到啥就蜜汁AC了。但是用c++的话要用数状数组之类的数据结构,应对大量的增删操作,才能不超时。
import java.util.*;public class Main{ public static void main(String args[]){ Scanner in=new Scanner(System.in); int i,n=in.nextInt(); int m=in.nextInt(); int a[]=new int
; for(i=0;i<n;i++){ a[i]=in.nextInt(); }
int a1,b1,b2,b3; long sum; for(i=0;i<m;i++){ a1=in.nextInt(); if(a1==1){ b1=in.nextInt(); b2=in.nextInt(); b3=in.nextInt(); if(b3==1)continue; for(int j=b1-1;j<=b2-1;j++) if(a[j]>=b3&&a[j]%b3==0) a[j]=a[j]/b3; }else if(a1==2){ b1=in.nextInt(); b2=in.nextInt(); sum=0; for(int j=b1-1;j<=b2-1;j++) sum+=a[j]; System.out.println(sum); } } in.close(); }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CCF CSP