快速冪取模
阿新 • • 發佈:2020-12-19
快速冪取模
計算ab mod p
int ksm(int a,int b,int p)
{
int ans=1;
while(b)
{
if(b&1) ans=ans*a%p;//b是奇數
a=a*a%p;
b>>=1;//b/2
}
return ans;
}
eg:hdu 2817
A sequence of numbers
http://acm.hdu.edu.cn/showproblem.php?pid=2817
題意:有n組資料,每組資料有4個數,前3個數表示序列(等比/等差)的前3個數字,最後一個數字k,求第k個數的值。
思路:根據等比和等差的性質,分別計算,對應序列的值,快速冪、取模。
#include<iostream> #include<algorithm> #include<math.h> #include<string.h> using namespace std; #define int long long int a[10]; const int p=200907; int ksm(int m,int b) { int ans =1; while(b) { if(b&1) ans=ans*m%p; m=m*m%p; b>>=1; } return ans; } int dengCha(int a[],int k) { int d=a[2]-a[1],a1=a[1]; return (a1%p+(k-1)%p*d%p)%p; } int dengBi(int a[],int k) { double q=a[2]*1.0/a[1]; return (q==1)?a[1]:((a[1]%p*ksm(q,k-1)%p)%p); } signed main() { int n;cin>>n; while(n--) { memset(a,0,sizeof a); for(int i=1;i<=3;i++) cin>>a[i]; int k;cin>>k; if(a[3]-a[2]==a[2]-a[1]) cout<<dengCha(a,k); else cout<<dengBi(a,k); cout<<endl; } }