POJ-3734-Blocks

来源:互联网 发布:sat知乎 编辑:程序博客网 时间:2024/05/16 06:29

求和,需要自己递推下公式,然后用矩阵快速幂解决~第一次做这种吧~

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<vector>using namespace std;const int mod=10007;vector<vector<int> > m,ans;int n;vector<vector<int> > Multi(vector<vector<int> > &a,vector<vector<int> > &b){    vector<vector<int> > ans;    ans.resize(3);    for(int i=0;i<3;i++)ans[i].resize(3);    for(int i=0;i<a.size();i++)for(int k=0;k<b.size();k++)    for(int j=0;j<b[0].size();j++)ans[i][j]=(ans[i][j]+a[i][k]*b[k][j])%mod;    return ans;}int main(){    int T;    scanf("%d",&T);    while(T--)    {scanf("%d",&n);m.clear();ans.clear();m.resize(3);m[0].push_back(2);m[0].push_back(1);m[0].push_back(0);m[1].push_back(2);m[1].push_back(2);m[1].push_back(2);m[2].push_back(0);m[2].push_back(1);m[2].push_back(2);ans.resize(3);ans[0].push_back(1);ans[1].push_back(0);ans[2].push_back(0);while(n){    if(n&1)ans=Multi(m,ans);    m=Multi(m,m);    n>>=1;}printf("%d\n",ans[0][0]);    }    return 0;}


0 0
原创粉丝点击