现在还是一知半解,所以还是先记录下来,以后我们再去细细的分析。主要是,我们以后要穿送指针的话,我们就把他包装成结构体,直接传送结构体,不要传送指针。
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll mod = 1e9+7; ll mod2 = 1e9+6; struct matrix{ ll base[2][2]; }; struct matrix multi( struct matrix a,struct matrix b ){ struct matrix ans; memset(ans.base,0,sizeof(ans.base)); for(int i=0; i<2; i++){ for(int j=0; j<2; j++){ for(int k=0; k<2; k++){ ans.base[i][j] = (ans.base[i][j] + (a.base[i][k]*b.base[k][j])%mod2)%mod2; } } } return ans; } struct matrix quick_pow(struct matrix a,ll m){ struct matrix ans; ans.base[0][0] = ans.base[1][1] = 1; ans.base[0][1] = ans.base[1][0] = 0; while( m ){ if( m&1 ) ans = multi(ans,a); m >>= 1; a = multi(a,a); } return ans; } ll quickint_pow(ll a,ll m){ ll ans = 1; while( m ){ if( m&1 ) ans = (ans*a)%mod; m >>= 1; a = (a*a)%mod; } return ans; } int main(){ ll a,b,n; struct matrix aa,ans; aa.base[0][0] = aa.base[0][1] = aa.base[1][0] = 1; aa.base[1][1] = 0; while( cin >> a >> b >> n ){ if( n==0 ){ cout << a << endl; continue; } ans = quick_pow(aa,n-1); cout << ( quickint_pow(a,ans.base[0][1]) * quickint_pow(b,ans.base[0][0]) )%mod << endl; } return 0; }