leetcode周赛---关于找规律+快速幂
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode周赛---关于找规律+快速幂相关的知识,希望对你有一定的参考价值。
题目
审题
根据题目所给的样例,我们可以得出规律,每个01组成的数组中,除了全是1的,其余均通过替换可以得到一个
000...1
和一个11111...0
,所以我们只需要得出111...0
的个数,最后的结果便是它的个数次方,再乘以全是1的数,最后再取模。
那么问题来了,这个次方太大了!!最多可能是2^59
次方次,看来必须用快速幂的方式处理了!
注意还有一大坑:MOD取模的时候,注意防止溢出,得取多次摸,而取多次模之前,不能使得其他因他而产生的数而改变!
提交代码
class Solution {
public:
const int MOD = 1e9+7;
using ll = long long;
int minNonZeroProduct(int p) {
//计算111...11,由于后面两个数字依仗这个数字,所以该数不能在此取模
ll x1 = (ll)pow(2,p) -1;
//得出111..10
ll x2 = (x1-1)%MOD;
//得出次数k
ll k = x1/2;
int res = 1;
//快速幂得出结果
while(k){
if(k&1){
res = (res*x2)%MOD;
}
x2 = (x2*x2)%MOD;
k = k>>1;
}
//注意防止乘积溢出,给x1再取一次幂
res = ((ll)res*(x1%MOD))%MOD;
return res;
}
};
以上是关于leetcode周赛---关于找规律+快速幂的主要内容,如果未能解决你的问题,请参考以下文章
hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!