背景:
今天我才发现快速乘有
的做法。
正题:
快速乘解决的是
的问题。
有时
特别大,
:
原理:
写成递归或递推的形式,在每一个可以的位置上
即可。
注意:
的结果符号由
确定,因此
的结果符号由
确定。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL x,y,mod;
LL dg(LL x,LL y,LL mod)
{
if(y==1) return x;
LL op=dg(x,y>>1,mod);
if(y&1) return (op*2%mod+x)%mod; else return op*2%mod;
}
int main()
{
scanf("%lld %lld %lld",&x,&y,&mod);
int op=((x<0&&y>0)||(x>0&&y<0));
printf("%lld\n",(op?-1ll:1ll)*dg(abs(x),abs(y),abs(mod)));
}
:
原理:
此时,我们的过程量用
来存储即可。
注意:
的结果符号由
确定,因此
的结果符号由
确定。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef long double LD;
LL x,y,mod;
LL times(LL x,LL y,LL mod)
{
LD t=LD(x)*LD(y)-LL(LD(x)*LD(y)/LD(mod))*LD(mod);
LL tt=(LL)t;
return tt>=0?tt%mod:(tt+mod)%mod;
}
int main()
{
scanf("%lld %lld %lld",&x,&y,&mod);
int op=((x<0&&y>0)||(x>0&&y<0));
printf("%lld\n",(op?-1ll:1ll)*times(abs(x),abs(y),abs(mod)));
}