poj3734矩阵快速幂

挑战上面的题目,感觉脑洞很大

分别找红蓝个数全为偶,全为奇,一奇一偶的个数ai,bi,ci

转移矩阵是| 2 1 0 |,是一个对称矩阵(会不会有什么联系。)

| 2 2 2 |

| 0 1 2 |

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 10007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=<<+,inf=0x3f3f3f3f; struct Node{
ll row,col;
ll a[N][N];
};
Node mul(Node x,Node y)
{
Node ans;
ans.row=x.row,ans.col=y.col;
memset(ans.a,,sizeof ans.a);
for(ll i=;i<x.row;i++)
for(ll j=;j<x.col;j++)
for(ll k=;k<y.col;k++)
ans.a[i][k]=(ans.a[i][k]+x.a[i][j]*y.a[j][k])%mod;
return ans;
}
Node quick_mul(Node x,ll n)
{
Node ans;
ans.row=x.row,ans.col=x.col;
memset(ans.a,,sizeof ans.a);
for(ll i=;i<ans.col;i++)ans.a[i][i]=;
while(n){
if(n&)ans=mul(ans,x);
x=mul(x,x);
n>>=;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
ll n,t;
cin>>t;
while(t--){
cin>>n;
Node A;
A.row=,A.col=;
memset(A.a,,sizeof A.a);
A.a[][]=,A.a[][]=,A.a[][]=;
A.a[][]=,A.a[][]=,A.a[][]=;
A.a[][]=,A.a[][]=,A.a[][]=;
A=quick_mul(A,n);
Node B;
B.row=,B.col=;
B.a[][]=,B.a[][]=,B.a[][]=;
B=mul(A,B);
cout<<B.a[][]%mod<<endl;
}
return ;
}
上一篇:POJ 3734 Blocks(矩阵快速幂+矩阵递推式)


下一篇:避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用