2016 沈阳 1003 Recursive sequence(hdu 5950)矩阵快速幂

来源:互联网 发布:mysql 控制台输出 编辑:程序博客网 时间:2024/05/16 04:41

题意:

给出f[1]=a;f[2]=b;f[n]=f[n-1]+2*f[n-2]+i*i*i*i;问f[n]对2147493647取模的值,n的范围到2的31次。


思路:

由于n的范围过大,必须要用矩阵快速幂求解。难点在于构造矩阵。一开始我的想法是把i的四次分别用(i-1)的四次、三次、二次、一次、零次表示,来构造矩阵,结果一直错,后来看了网上有人是把i+1的四次用i来表示来构造的矩阵,于是我换了下矩阵,就过了,至今不明白原来构造的矩阵为什么就不行。

矩阵如下:



ps: 2147493647记得用 unsigned int,别问我为什么知道QAQ


代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const unsigned int mod=2147493647;struct p{    long long x[8][8];} u, o;void init(long long r[][10], long long y[][10]){    int i, j;    for(i=0; i<=6; i++)    {        for(j=0; j<=6; j++)        {            u.x[i][j]=y[i][j];        }    }    for(i=0; i<=6; i++)    {        for(j=0; j<=6; j++)        {            o.x[i][j]=r[i][j];        }    }}p multi(p a, p b){    int i, j, k;    p c;    for(i=0; i<7; i++)    {        for(j=0; j<7; j++)        {            long long sum=0;            for(k=0; k<=6; k++)            {                sum=(sum+(a.x[i][k]*b.x[k][j])%mod)%mod;            }            c.x[i][j]=sum;        }    }    return c;}p  rec_quickmod(p a, int n){    p b;    memset(b.x, 0, sizeof(b.x));    int i, j;    for(i=0; i<=6; i++)b.x[i][i]=1;    while(n)    {        if(n%2)b=multi(b,a);        n/=2;        a=multi(a,a);    }    return b;}int main(){    int t;    scanf("%d",&t);    int i, j;    long long x[8][10]= {{1,1,0,0,0,0,0}, {2,0,0,0,0,0,0}, {1,0,1,0,0,0,0}, {0,0,4,1,0,0,0}, {0,0,6,3,1,0,0}, {0,0,4,3,2,1,0},{0,0,1,1,1,1,1}};    long long y[8][10]= {{0,0,81,27,9,3,1}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}};    while(t--)    {        int n;        long long a, b;        scanf("%d%lld%lld", &n, &a, &b);        if(n==1){printf("%lld\n", a);continue;}        if(n==2){printf("%lld\n", b);continue;}        y[0][0]=b;        y[0][1]=a;        init(x, y);        p c=rec_quickmod(o,n-2);        p ans=multi(u,c);//         for(i=0; i<7; i++)//        {//            for(j=0; j<7; j++)//            {//                printf("%lld ", ans.x[i][j]);//            }//            printf("\n");//        }        printf("%lld\n", ans.x[0][0]);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机开机卡在菊花那里怎么办 车辆挂牌时公司名称打错了怎么办 经营异常名录查不到怎么办移除 企业被列入经营税务异常名录怎么办 手机号被别人绑定了企业微信怎么办 刚出生一天的婴儿不肯吃奶怎么办 9个月孩子不好好吃奶怎么办 孩子2个月吃奶老是呛到怎么办 孩子4个月不好好吃奶怎么办? 3个月的孩子不吃奶肚子胀怎么办 刚出生的婴儿吃完奶打嗝怎么办 宝宝刚生下来一直睡觉不吃奶怎么办 刚生下来的婴儿不吃奶怎么办 刚生下来的小猫不吃奶怎么办 刚生的小羊羔不吃奶怎么办 刚出生的婴儿不会吸奶怎么办 生完小孩七十天妈妈咳嗽怎么办 带欣的名字三个字儿的怎么办 二十多岁的儿子沉迷游戏网络怎么办 为什么打开游戏网络却用不了怎么办 打来微信网页版显示证书错误怎么办 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办