求 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; }