快速乘法模板
快速乘法使用二進制將乘法轉(zhuǎn)化為加法,既加快可以加快運算速度,又可以防止直接相乘之后溢出
簡單的寫法:
ll quickMul(ll a,ll b,ll mod) {ll res=0;while(b){if(b&1) res=(res+a)%mod;a=(a+a)%mod;b>>=1;}return res; }更快更高效的寫法:
ll mul(ll a,ll b,ll mod) {a%=mod;b%=mod;ll res=0;while(b){if(b&1){res+=a;if(res>=mod)res-=mod;}b>>=1;a<<=1;if(a>=mod) a-=mod;}return res; }利用快速乘法優(yōu)化的快速冪:
ll mul(ll a,ll b,ll mod) {a%=mod;b%=mod;ll res=0;while(b){if(b&1){//printf("%lld %lld %lld\n",a,b,res);res+=a;if(res>=mod)res-=mod;}b>>=1;a<<=1;if(a>=mod) a-=mod;}return res; } ll quickPow(ll a,ll b,ll m) {ll res=1;while(b){if(b&1)res=mul(res,a,m);a=mul(a,a,m);b>>=1;}return res; }?
總結(jié)
- 上一篇: Java静态方法调用非静态方法
- 下一篇: HDU4135 HDU2841 HDU1