整数快速幂,计算x^N,有些情况下需要 %mod
int QuickPow(int x, int N) {
int res = x;
int ans = 1;
while (N) {
if (N & 1) {
ans = ans * res;
}
res = res * res;
N = N / 2;
}
return ans;
}
加个 long long 的方便自己 copy
#define ll long long
const int mod = 1e9 + 7;
ll QuickPow(ll x, ll N) {
ll res = x % mod;
ll ans = 1;
while (N) {
if (N & 1) {
ans = ans * res % mod;
}
res = res * res % mod;
N = N / 2;
}
return ans;
}
还需要加个 Java 的大数板子,这玩意写的太费劲了。
static BigInteger QuickPow(BigInteger x, BigInteger N) {
BigInteger res = x.mod(BigInteger.valueOf(mod));
BigInteger ans = BigInteger.valueOf(1);
while (N.compareTo(BigInteger.valueOf(0)) > 0) {
if (N.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(1))) {
ans = ans.multiply(res).mod(BigInteger.valueOf(mod));
}
res = res.multiply(res).mod(BigInteger.valueOf(mod));
N = N.divide(BigInteger.valueOf(2));
}
return ans;
}
//拓展
int Quick_Multiply(int a,int b,int c) //快速积(和快速幂差不多)
{
long long ans=0,res=a;
while(b)
{
if(b&1)
ans=(ans+res)%c;
res=(res+res)%c;
b>>=1;
}
return (int)ans;
}
//n为矩阵边长
void pro(int l1[][20],int l2[][20],int t[][20])
{
memset(t,0,sizeof t);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
t[i][j]=(t[i][j]+l1[i][k]*l2[k][j]);
}
矩阵快速幂
数组
//n为矩阵边长
int in[20][20];
int list[20][20];
//list是in的num次方
int temp[20][20];
int t[20][20];
void multi(int l1[][20],int l2[][20],int t[][20])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
t[i][j]=0;
for(int k=1;k<=n;k++)
t[i][j]=(t[i][j]+l1[i][k]*l2[k][j]);
}
}
//num为幂
void f(int num)
{
if(num==0)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
list[i][j]=(i==j);
return;
}
f(num/2);
multi(list,list,temp);
if(num%2)
multi(temp,in,list);
else
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
list[i][j]=temp[i][j];
}
结构体
struct Matrix {
ll v[6][6];
};
// rank 阶 矩阵相乘
Matrix mul(Matrix a, Matrix b, int rank) {
Matrix tmp;
memset(tmp.v, 0, sizeof(tmp.v));
for (int i = 0; i < rank; i++) {
for (int j = 0; j < rank; j++) {
for (int k = 0; k < rank; k++) {
tmp.v[i][j] = (tmp.v[i][j] + a.v[i][k] * b.v[k][j] % mod) % mod;
}
}
}
return tmp;
}
// 快速幂算法,求 rank 阶 矩阵 res 的 N 次幂
Matrix QuickPower(Matrix res, ll N, int rank) {
Matrix ans;
//上面整数的幂的ans初始化为1,
//对于矩阵的乘法来说,
//ans应该初始化为单位阵,
//对于单位矩阵E
//任何矩阵A*E=A
for (int i = 0; i < rank; i++) {
for (int j = 0; j < rank; j++) {
ans.v[i][j] = (i == j);
}
}
while (N) {
if (N & 1) {
ans = mul(ans, res, rank);
}
res = mul(res, res, rank);
N = N >> 1;
}
return ans;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
const int maxn=10;
struct Matrix
{
int m[maxn][maxn];
}ans,res;
//计算矩阵乘法的函数,参数是矩阵a,矩阵b和一个n,
//代表这两个矩阵是几阶方阵。
Matrix Mul(Matrix A, Matrix B, int n)
{
Matrix tmp;//定义一个临时矩阵,存放A*B的结果
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
tmp.m[i][j]=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
tmp.m[i][j]=(tmp.m[i][j]+A.m[i][k]*B.m[k][j])%10000;
return tmp;
}
//快速幂算法,求矩阵res的N次幂
void QuickPower(int N,int n)
{
//上面整数的幂的ans初始化为1,
//对于矩阵的乘法来说,
//ans应该初始化为单位阵,
//对于单位矩阵E
//任何矩阵A*E=A
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ans.m[i][j]=(i==j);
while(N)
{
if(N&1)
ans=Mul(ans,res,2);
res=Mul(res,res,2);
N=N>>1;
}
}
int main()
{
int n;
while(cin>>n,n>=0)
{
if(n<=1)
cout<<n<<endl;
else
{
res.m[0][0]=res.m[0][1]=res.m[1][0]=1;
res.m[1][1]=0;
QuickPower(n,2);
cout<<ans.m[0][1]<<endl;
}
}
return 0;
}