Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合位与指数模运算相结合_Java_Bit Manipulation_Modular Arithmetic_Mod - Fatal编程技术网

Java 集合位与指数模运算相结合

Java 集合位与指数模运算相结合,java,bit-manipulation,modular-arithmetic,mod,Java,Bit Manipulation,Modular Arithmetic,Mod,我昨天在一次挑战中得到了这个问题。我认为我已经正确地编码了它,我的示例测试用例通过了。然而,甚至没有一个测试用例在后端通过。这是我的密码。求求你,有人,帮帮我。挑战对我来说已经结束了,所以我不能再提交了。但我想从我的错误中吸取教训。谢谢 import java.io.*; //import java.util.*; public class TestClass { public static void main(String[] args) throws IOException

我昨天在一次挑战中得到了这个问题。我认为我已经正确地编码了它,我的示例测试用例通过了。然而,甚至没有一个测试用例在后端通过。这是我的密码。求求你,有人,帮帮我。挑战对我来说已经结束了,所以我不能再提交了。但我想从我的错误中吸取教训。谢谢

  import java.io.*;
//import java.util.*;


public class TestClass {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter wr = new PrintWriter(System.out);
         int n = Integer.parseInt(br.readLine().trim());
         String[] arr_a = br.readLine().split(" ");
         int[] a = new int[n];
         for(int i_a=0; i_a<arr_a.length; i_a++)
         {
            a[i_a] = Integer.parseInt(arr_a[i_a]);
         }

         long out_ = solve(a);
         System.out.println(out_);

         wr.close();
         br.close();
    }
    static long solve(int[] a){
        // Write your code here
        long sum = 0l;
        long MAX = 10000000011l;
        long i = 1l;
        for(int x : a) {
            long count = 0;
            while(x>0) {
                x &= (x-1l);
                count++;
            }
            long res = 1l;
            long temp = i;
            count = count % MAX;
            while(temp > 0) {
                if((temp & 1l) == 1l) {
                    res = (res * count) % MAX;
                }
                temp = temp >> 1l;
                count = ((count % MAX) * (count % MAX)) % MAX;

            }

            long t =((sum%MAX) + (res % MAX))%MAX;
            sum = t;
            i++;
        }

        return sum;
    }
}
import java.io.*;
//导入java.util.*;
公共类TestClass{
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
PrintWriter wr=新的PrintWriter(系统输出);
int n=Integer.parseInt(br.readLine().trim());
字符串[]arr_a=br.readLine().split(“”);
int[]a=新的int[n];
对于(int i_a=0;i_a0){
x&=(x-1l);
计数++;
}
长res=1l;
长温=i;
计数=最大计数百分比;
而(温度>0){
如果((温度和1l)=1l){
res=(res*计数)%MAX;
}
温度=温度>>1l;
计数=((计数%MAX)*(计数%MAX))%MAX;
}
长t=((总和%MAX)+(分辨率%MAX))%MAX;
总和=t;
i++;
}
回报金额;
}
}
有点奇怪,“甚至没有一个测试用例通过”,但我看到的唯一错误是您的部分

所有数字都小于
10^10+11
,但该常数大于32位,并且在乘法时,有时会出现溢出(因为
long
是64位有符号整数)

这可以通过几种方法解决:

  • (a*b)%M可以使用类似于“平方求幂”实现的算法来完成操作。您只需要将所有乘法替换为加法。因此,乘法被替换为
    O(log(n))
    加法和“乘以2”运算。示例实现:

    static long multiply(long a, long b, long M) {
        long res = 0;
        long d = a % M;
    
        while (b > 0) {
            if ((b & 1) == 1) {
                res = (res + d) % M;
            }
    
            b >>= 1;
            d = (d + d) % M;
        }
        return res;
    }
    
  • 您可以只缓存以前计算的步数的
    b^i%M
    数字。对于每一个设置位(没有那么多),您可以保存以前计算的值和
    last(b)
    -当
    a[i]
    b
    设置位时的最后
    i
    。然后用一个线性循环计算新值,从
    last(b)+1
    到当前索引
    i

  • 用于乘法


  • 你的代码看起来不错。我看到的唯一问题是
    count*count
    可能超过
    long
    限制。如何解决?就像我必须做的那样((count%max)×(count%max))%max?试试
    biginger
    。不,伙计,这个主意也不管用。它失败是因为时间还是因为给出了错误的答案?我明白你的意思,但现在在f(n)=0^0+1^1+2^2中实现你的方法时不。f(n)mod m,其中n@BrijRajKishore,当您将大于
    2^31
    的数字相乘时,需要使用此方法(如上面的问题所示)。如果你有
    n,我试过上面的方法,有没有你的乘法方法,以及用BigInteger来回答问题f(n)%m。其中f(n)=0^0+1^1+2^2。。。。但我所得到的只是一点点。为什么?这不是快速算法吗?请帮帮我。@BrijRajKishore,这是一个完全不同的任务,你为什么不提出一个新问题?我相信你不需要从我的答案中找到任何方法来解决这个问题。请注意,
    m
    相对较小。