我需要计算(n*(2n+1)*(n+1)*(3(n^2)+3n+1))/30 modulo m
其中:
- 30& m可以是非共同素数
- n
的值最高可达10^10
(long long int
太大)
- m
可以包含高达10000的任何值
我试过这个:
long long int tp1;
double k;
k=n;
k=k*((2*n)+1);
k=k*(n+1);
k=k*((3*n*n)+(3*n)-1);
tp1=fmod(k/30,m);
答案 0 :(得分:3)
As noted by molbdnilo,你可以用一定数量的模数进行所有计算。
扩展这个想法:
(x * y) mod m
与((x mod m) * (y mod m)) mod m
(x + y) mod m
与((x mod m) + (y mod m)) mod m
然而
(x / y) mod m
与((x mod m) / (y mod m)) mod m
因此,您必须计算n*(2n+1)*(n+1)*(3(n^2)+3n+1) mod (30 * m)
,并将其除以30。
P.S。我假设除法运算与c ++相同,“除以四舍五入”。
答案 1 :(得分:1)
对于非常长的整数,请使用Gnu项目中的GMP。 GMP
使用c ++变体(gmpxx),您只需要将您的数字改为:
mpz_class number;
你可以像这样完成你的计算:
number = k*((3*n*n)+(3*n)-1);
其中k和n可以是int或mpz_class(或许多其他)。
我希望这会对你有所帮助!