Какая часть этого кода замедляет мою программу
Я отвечал на конкурсный вопрос, используя этот код:
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
import java.math.BigInteger;
//ans is modulu 998244353
public class ShiftAndAdd {
private static long mod = 998244353;
private static Scanner input = new Scanner(System.in);
public static void main(String[] args)throws IOException {
BigInteger ans=new BigInteger("0");
int n,m;
BigInteger numb_a,numb_b;
n= input.nextInt();
m=input.nextInt();
numb_a=input.nextBigInteger();
numb_b=input.nextBigInteger();
long[] a = new long[n];
long[] b = new long[m];
long[] a1 = new long[n];//will contain indices of cells of "a" containing 1's
long[] b1 = new long[m];
int ka1=0;//will be actual length of a1
int kb1=0;//will be actual length of b1
for(int i=0;i<n;i++) {
a[n-1-i]=numb_a.longValue()%10;
numb_a=numb_a.divide(new BigInteger("10"));
}
for(int i=0;i<m;i++) {
b[m-1-i]=numb_b.longValue()%10;
numb_b=numb_b.divide(new BigInteger("10"));
}
int a1start=(m>=n)?m-n:0;
ka1=a1start;
for(int i=0;i<n;i++)
if(a[i]==1)
a1[ka1++]=i;
int counter=0;
for(int i=0;i<m;i++)
if(b[i]==1)
b1[kb1++]+=++counter;
else b1[kb1++]=counter;
//answer:
for(int i=a1start;i<ka1;i++) {
ans=ans.add(BigInteger.valueOf((fastExp((long)2,(n-1-a1[i]))%mod *b1[(int)(a1[i]+a1start)] %mod)%mod));
}
print(ans.longValue());
}//end main
private static long fastExp(long a,long b) {
if(b>0) {
if(b%2==0)
return fastExp((a%mod*a%mod)%mod,b/2);
else return (a%mod*fastExp(a,b-1)%mod)%mod;
}
return 1;
}//end method fastExp
private static void print(long t) {
System.out.println(t);
}//end method print
}//end class ShiftAndAdd
тем не менее, онлайн-компилятор дал мне, что превышен лимит времени для некоторого ввода (который вводит очень большое целое число в переменные numb_a и numb_b), моя проблема в том, что я не знаю, где превышен лимит времени, когда я читал целые числа, потому что методы класса BigInteger медленные? или это из-за медленных методов valueOf и add этого класса? мне нужно знать причину, чтобы попытаться это исправить
1 ответ
Если вам не нужно использовать java.math.BigInteger, лучше вместо этого использовать примитив long, использование неизменяемых объектов хорошо для масштабируемости, но, поскольку вы не запускаете более одного потока, вы не получите преимущества от его использования, но получите недостатком GC является то, что GC будет работать чаще, если вы используете объекты больше, чем примитивы.