Какая часть этого кода замедляет мою программу

Я отвечал на конкурсный вопрос, используя этот код:

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 будет работать чаще, если вы используете объекты больше, чем примитивы.

Другие вопросы по тегам