1. 程式人生 > 實用技巧 >快速冪取模

快速冪取模

快速冪取模

計算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;
	}
}