给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),
每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?
例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
与上一题的区别在于,长度n比较大,所以要进行取模运算。
取模方法一,快速幂取模。
publicintcuttingRope(int n){if(n <=3){return n -1;}int b = n %3;int p =1000000007;long rem =1;//这里不能用int,因为Java中int不能自动转换为long类型,但是int可以自动转换为doublelong x =3;//不能用int x = 3;for(int a = n /3-1; a >0; a /=2){if(a %2==1){
rem =(rem * x)% p;}
x =(x * x)% p;}if(b ==0)return(int)(rem *3% p);if(b ==1)return(int)(rem *4% p);return(int)(rem *6% p);}
方法二,循环取模,运算时间慢,不值得考虑。
publicintcuttingRope(int n){if(n <=3){return n -1;}int b = n %3;int p =1000000007;long rem =1;long x =3;//for循环不一样,所以运算时间差别比较大。for(int a = n /3-1; a >0; a--){
rem =(rem * x)% p;}if(b ==0)return(int)(rem *3% p);if(b ==1)return(int)(rem *4% p);return(int)(rem *6% p);}