大体题意:
让你求n个斐波那契数列,对1e9取模!
思路:
很明显矩阵快速幂 求矩阵1 1
1 0的n 次方即可!
但是好久没写了,写了很久很久!!= = !
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<cctype>
#include<string>
#include<iostream>
#include<queue>
#define fout freopen("out.txt","w","stdout");
#define mr make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long LLU;
const int maxn = 1000 + 5;
const int mod = 1000000000;
const double eps = 1e-8;
const int inf = 0x3f3f3f3f;
struct Mar{
ll a[2][2];
void clear(){
memset(a,0,sizeof a);
}
bool operator = (Mar rhs) {
a[0][0] = rhs.a[0][0];
a[0][1] = rhs.a[0][1];
a[1][0] = rhs.a[1][0];
a[1][1] = rhs.a[1][1];
return 1;
}
}unit;
Mar mul(Mar m1,Mar m2){
Mar tmp;
tmp.clear();
tmp.a[0][0] = (m1.a[0][0]%mod*m2.a[0][0]%mod + m1.a[0][1]%mod * m2.a[1][0]%mod)%mod;
tmp.a[0][1] = (m1.a[0][0]%mod*m2.a[0][1]%mod + m1.a[0][1]%mod * m2.a[1][1]%mod)%mod;
tmp.a[1][0] = (m1.a[1][0]%mod*m2.a[0][0]%mod + m1.a[1][1]%mod * m2.a[1][0]%mod)%mod;
tmp.a[1][1] = (m1.a[1][0]%mod*m2.a[0][1]%mod + m1.a[1][1]%mod * m2.a[1][1]%mod)%mod;
return tmp;
}
Mar my_pow(Mar a,ll n,ll id){
Mar ans = unit;
while(n){
if (n & 1)
ans = mul(ans,a);
n/=2;
a = mul(a,a);
}
return ans;
}
ll gcd(ll a,ll b){
return !b ? a : gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a*b/gcd(a,b);
}
int main(){
unit.a[0][0] = 1;
unit.a[0][1] = 0;
unit.a[1][0] = 0;
unit.a[1][1] = 1;
int T;
scanf("%d",&T);
while(T--){
ll k,n;
Mar tmp;
tmp.a[0][0] = 1;
tmp.a[0][1] = 1;
tmp.a[1][0] = 1;
tmp.a[1][1] = 0;
Mar tt = mul(tmp,tmp);
scanf("%lld %lld",&k,&n);
Mar ans = my_pow(tmp,n,k);
printf("%lld %lld\n",k,ans.a[1][0]);
}
return 0;
}