HDU - 4549 斐波那契数列 (费马小定理+快速幂矩阵)

题意:

你会发现a和b的指数变化就是斐波那契数列,再结合费马小定理,定理应用到这一题就是可以将(A^B)%mod = (A^(B % mod ) )% mod)。

注意:用 long long防止数据溢出,最后a,b相乘之后要再取一次模。

#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
const int mo = 1e9 + 6; 
struct node{
	ll m[2][2];
	
};
node cmp(node a, node b){
		node te;
	for(int i = 0; i < 2; i++)
		for(int j = 0; j < 2; j++){
		te.m[i][j]=0;
			for(int k = 0; k< 2; k++){
				te.m[i][j] += a.m[i][k] * b.m[k][j];//;long long防止数据溢出 
				te.m[i][j] %= mo; 
			}
		}
	return te;
}
node powermod(int n){
		node ans,base;
		base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
	    base.m[1][1] = 0;
	    ans.m[0][0] = ans.m[1][1] = 1;// ans 初始化为单位矩阵
	    ans.m[0][1] = ans.m[1][0] = 0;
	    while(n){
	    	if(n&1) ans = cmp(ans, base);
	    	n >>= 1;
	    	base=cmp(base, base);
		}
		return ans;
	}
ll powermod_2(ll a,ll b ,ll c){
	ll ans= 1;
	a = a % c;
	while(b>0){
		if(b%2) ans = (ans * a) %c;
		b = b/2;
		a = (a * a)%c; //若a不为long long溢出 
	}
	return ans;	
} 
 
int main(){
	int a,b,n;
	node te;
	while(scanf("%d%d%d",&a,&b,&n)!= EOF){
		te = powermod(n);
		ll tt=powermod_2(a,te.m[1][1],1e9+7)*powermod_2(b,te.m[1][0],1e9+7);
		printf("%I64d\n",tt%(mo+1));//忘了再取余一次导致wa 
	}
	return 0;
}


你可能感兴趣的:(快速幂)