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
相对较小。