hdu-4686 Arc of Dream

http://acm.hdu.edu.cn/showproblem.php?pid=4686    

题意:已知a0,ax,ay  a[i] = ax * a[i-1] + ay;

b0,bx,by    b[i] = bx * b[i-1] + by;

求 ai*bi(0 < i <(n-1)) 的和;

ac代码:

/**
*设前n想和为sum[n],则:
*         a[n]*b[n] = a[n-1]*b[n-1]*ax*bx + a[n-1]*ax*by + b[n-1]*ay*bx + ay * by;
*
*                  
*                                                                                  {   1     0     0   0   0 }
*                                                                                  { ax*bx  ax*bx  0   0   0 }
*{sum[n],a[n-1]*b[n-1],a[n-1],b[n-1],1} = {sum[n-1],a[n-2]*b[n-2],a[n-1],b[n-2],1}*{ ax*by  ax*by  ax  0   0 }
*                                                                                  { ay*bx  ay*bx  0   bx  0 }
*                                                                                  { ay*by  ay*by  ay  by  1 }
*
*
*
**/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef __int64 LL;
#define mod 1000000007
struct Z{
    LL m[5][5];
    Z(){
        memset(m,0,sizeof(m));
    }
    void init(){
        for(int i = 0;i < 5;i++)
            m[i][i] = 1;
    }
};
Z operator * (Z a, Z b){
    Z c;
    for(int i = 0;i < 5;i++)
        for(int k = 0;k < 5;k++)
            for(int j = 0;j < 5;j++)
                c.m[i][j] = (c.m[i][j] + a.m[i][k]*b.m[k][j])%mod;
    return c;
}
Z Pow(Z a,LL x){
    Z ret;
    ret.init();
    while(x){
        if(x & 1) ret = ret * a;
        a = a * a;
        x >>= 1;
    }
    return ret;
}
int main(){
    LL n,a0,ax,ay,b0,bx,by;
    while(cin >> n)
    {
        cin >> a0 >> ax >> ay;
        cin >> b0 >> bx >> by;
        LL k = a0 * b0 % mod;
        if(n == 0){cout << 0 <<endl;continue;}
        Z s;
        s.m[0][0] = 1;
        s.m[1][0] = ax*bx%mod;s.m[1][1] = ax*bx%mod;
        s.m[2][0] = ax*by%mod;s.m[2][1] = ax*by%mod;s.m[2][2] = ax%mod;
        s.m[3][0] = ay*bx%mod;s.m[3][1] = ay*bx%mod;s.m[3][3] = bx%mod;
        s.m[4][0] = ay*by%mod;s.m[4][1] = ay*by%mod;s.m[4][2] = ay%mod;
        s.m[4][3] = by%mod;s.m[4][4] = 1;
        s = Pow(s,n-1);
        LL ans = (s.m[0][0]*k + s.m[1][0]*k + s.m[2][0]*a0 + s.m[3][0]*b0 + s.m[4][0])%mod;
        cout << ans << endl;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值