import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
long []a=new long[n+1];//记录每道题的选项数量
long []b=new long[n+1];//记录每道题的正确答案
long temp=0;//记录累计的cb乘积
long c=0;//记录c的大小
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
}
for(int i=1;i<=n;i++){
if(i==1){
c=a[1];
b[i]=m%c;//c0为1,所以直接取m的余数
temp+=b[i];
}
else{
c*=a[i];//c等于累乘的a
b[i]=(m%c-temp)/(c/a[i]);//由原算法变换而来,其中c/a[i],是获取上一个序号c的值
temp+=b[i]*a[i-1];
}
}
for(int i=1;i<=n;i++){
System.out.print(b[i]+" ");
}
}
}
语句优化版:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int []chose=new int[n+1];
int []num=new int[n+1];
int []ans=new int[n+1];
num[0]=1;
for(int i=1;i<=n;i++){
chose[i]=sc.nextInt();
num[i]=num[i-1]*chose[i];//累乘,求取选项前缀乘积存入对应数组
}
ans[1]=m%num[1];//特殊情况
for(int i=2;i<=n;i++){
ans[i]=(m%num[i]-m%num[i-1])/num[i-1];//m%对应位置的累乘积 - m%上一位置的累乘积 / 上一位置的累乘积
}
for(int i=1;i<=n;i++){
System.out.print(ans[i]+" ");
}
}
}
整合优化版:
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int a[]=new int[n+1];
int b[]=new int[n+1];
int c[]=new int[n+1];
c[0]=1;
int temp=0;
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
c[i]=a[i]*c[i-1];
b[i]=(m%c[i]-temp)/c[i-1];
System.out.print(b[i]+" ");
temp=m%c[i];
}
}
}