快速幂学习笔记
我们不妨先来看一道例题了解一下快速幂:
【模板】快速幂
A template.
观察到数据,
因此考虑优化:快速幂。
什么是快速幂?
顾名思义,就是快速地求出幂(
怎么快速地求出幂?
将
下面的
然后将相邻两项合并,得到:
这是会消除
但是
因此,每次操作都会让
如果说 qwq
)。
代码实现
喜欢用函数的,可以定个
-
特判
的情况,直接返回 。- 其实还有一种情况,就是
,但是任何数的 次方都等于 ,因此不用顾虑。
- 其实还有一种情况,就是
-
当
才做,用一个while()
循环。-
如果
(是奇数),那么 处理多下的一个 ,也就是 。 -
然后
, ,这就不用解释了吧。
-
-
最后返回
即可。
code
#define ll long long
inline ll quick_pow(ll a,ll b) {
if(!a) return 0;
ll ans=1;
while(b){
if(b&1)//位运算优化。
ans=ans*a;
a=a*a;
b>>=1;//位运算优化 * 2。
}
return ans;
}
但这样并不能通过此题,因为
那么就在上面的代码取模一下就行啦:
局部
#define ll long long
inline ll quick_pow(ll a,ll b,ll p) {
if(!a) return 0;
ll ans=1;
while(b){
if(b&1) ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
P10035 「FAOI-R2」Paint (A)
首先打出模拟代码找规律(别的大佬都是证明,就我找规律)。
i 从 1~10 的 answer:
1
4
13
40
121
364
1093
3280
9841
29524
咦,奇怪了,这好像哪里见过,不就是小学奥数的一道经典找规律吗?
递推公式:
通项公式:
求
但是除法没有同余性质,所以需要求逆元。 不知道逆元的,建议去这里。
代码就简单了:
ll quick_pow(ll x,ll p){//快速幂模板。
ll res=x,ans=1;
while(p){
if(p&1) ans=ans*res%MOD;
res=res*res%MOD;
p>>=1;
}
return ans;
}
int main(){
cin>>T;
sum=quick_pow(2,MOD-2);//求逆元。
while(T--){
cin>>n;
ssum=quick_pow(3,n);
ssum=(ssum-1+MOD)%MOD;
cout<<ssum*sum%MOD<<endl;
}
return 0;
}
但好像费马小定理有一个条件,不过似乎数据都是
好啦,就到这里吧。
本文来自博客园,作者:2021zjhs005,转载请注明原文链接:https://www.cnblogs.com/2021zjhs005/p/18014134
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具