求 a 乘 b 对 p 取模的值。 输入格式 第一行输入整数a,第二行输入整数b,第三行输入整数p。 输出格式 输出一个整数,表示a*b mod p的值。 数据范围 1≤a,b,p≤1018 输入样例: 3 4 5 输出样例: 2
题解:
法一:时间复杂度O(log)
对于a*b%p,由于a,b都是大数,可以将b拆成2的幂的和的表示,时间复杂度为log级别。
a*b=a*(2^j1+2^j2+..2^jn)
a*b%p=a*2^j1%p+a*2^j2%p+...+a*2^jn%p
法二:时间复杂度O(1)
根据 a%p=a-(a/p)*p
参见2009国家集训队论文:
骆可强:《论程序底层优化的一些方法与技巧》
题解:
法一:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define LL long long LL a,b,p; LL slove(LL x,LL y,LL z) { LL res=0,hh=1; while(y) { if(y&1) res=(res+x)%z; y=y>>1; x=(x<<1)%z; } return res%z; } int main() { cin>>a>>b>>p; cout<<slove(a,b,p); return 0; }
法二:
#include<bits/stdc++.h> using namespace std; #define LL long long LL a,b,p; LL ksc(LL a,LL b,LL p) { return (a*b-(LL)((long double)a/p*b)*p+p)%p; } int main() { cin>>a>>b>>p; cout<<ksc(a,b,p); return 0; }