题面
题目就是一个找规律地题,主要wa了好多次原因是没有想到用快速幂。
AC代码
#include<algorithm>
#include<cassert>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<list>
#include<stack>
using namespace std;
long long mod_mul(long long a,long long b,long long p) {
long long r=0;
long long t=a;
while(b) {
if(b&1) r=(r+t)%p;
t=(t<<1)%p;
b>>=1;
}
return r;
}
long long mod_pro(long long a,long long b,long long p) {
long long r=1;
long long t=a;
while(b) {
if(b&1) r=mod_mul(r,t,p)%p;
t=mod_mul(t,t,p)%p;
b>>=1;
}
return r;
}
int main(){
long long n;
long long mod=1000000007;
while(~scanf("%I64d",&n)){
if(n==1)
cout<<1<<endl;
else if(n==2)
cout<<4<<endl;
else
{
printf("%d\n",(4*mod_pro(3,n-2,mod))%mod);
}
}
return 0;
}
关于快速幂
ll ksm(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
关于矩阵快速幂
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod = 10000;
const int maxn = 35;
int N;
struct Matrix {
int mat[maxn][maxn];
int x, y;
Matrix() {
memset(mat, 0, sizeof(mat));
for (int i = 1; i <= maxn - 5; i++) mat[i][i] = 1;
}
};
inline void mat_mul(Matrix a, Matrix b, Matrix &c) {
memset(c.mat, 0, sizeof(c.mat));
c.x = a.x; c.y = b.y;
for (int i = 1; i <= c.x; i++) {
for (int j = 1; j <= c.y; j++) {
for (int k = 1; k <= a.y; k++) {
c.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % mod;
c.mat[i][j] %= mod;
}
}
}
return ;
}
inline void mat_pow(Matrix &a, int z) {
Matrix ans, base = a;
ans.x = a.x; ans.y = a.y;
while (z) {
if (z & 1 == 1) mat_mul(ans, base, ans);
mat_mul(base, base, base);
z >>= 1;
}
a = ans;
}
int main() {
while (cin >> N) {
switch (N) {
case -1: return 0;
case 0: cout << "0" << endl; continue;
case 1: cout << "1" << endl; continue;
case 2: cout << "1" << endl; continue;
}
Matrix A, B;
A.x = 2; A.y = 2;
A.mat[1][1] = 1; A.mat[1][2] = 1;
A.mat[2][1] = 1; A.mat[2][2] = 0;
B.x = 2; B.y = 1;
B.mat[1][1] = 1; B.mat[2][1] = 1;
mat_pow(A, N - 1);
mat_mul(A, B, B);
cout << B.mat[1][1] << endl;
}
return 0;
}