hdu 5950

来源:互联网 发布:淘宝助理无法显示订单 编辑:程序博客网 时间:2024/06/19 00:21

题目链接:点击打开链接


题解思路:由(n+1)^4 = n^4 + 4n^3 + 6n^2 + 4n + 1,(n+1)^3 = n^3 + 3n^2 + 3n + 1...我可以做出一个7*7的矩阵,递推所有的函数


代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 2147493647;int n,a,b;struct data{    ll matr[7][7];    //data(){  memset(matr,0,sizeof(matr));  }};const data multi={1,1,0,0,0,0,0,                  2,0,0,0,0,0,0,                  1,0,1,0,0,0,0,                  4,0,4,1,0,0,0,                  6,0,6,3,1,0,0,                  4,0,4,3,2,1,0,                  1,0,1,1,1,1,1};data newdata(data A,data B){    data c;    for(int i=0;i<7;i++){        for(int j=0;j<7;j++){            c.matr[i][j] = 0;            for(int k=0;k<7;k++)            c.matr[i][j] = (c.matr[i][j]+A.matr[i][k]*B.matr[k][j]%mod)%mod;        }    }    return c;}data kuaisu(int x){    data ans,ret = multi;    ans.matr[0][0] = b,ans.matr[0][1] = a;    for(int i=2;i<7;i++) ans.matr[0][i] = ll(pow(2.0,6-i));    for(int i=1;i<7;i++) for(int j=0;j<7;j++) ans.matr[i][j] = 0;    while(x){        if(x&1) ans = newdata(ans,ret);        x >>= 1;        ret = newdata(ret,ret);    }    return ans;}int main(){    int t;    scanf("%d",&t);    while(t--){        scanf("%d%d%d",&n,&a,&b);        if(n==1) printf("%d\n",a);        else if(n==2) printf("%d\n",b);        else{            n -= 2;            data ans = kuaisu(n);            printf("%lld\n",ans.matr[0][0]);        }    }    return 0;}

原创粉丝点击