博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 4686 函数积的前缀和
阅读量:4595 次
发布时间:2019-06-09

本文共 2568 字,大约阅读时间需要 8 分钟。

题意:求\(\sum_{i=0}^{n-1}a_ib_i\)

其中,\(a_i=A_xa_{i-1}+A_y,b_i=B_xb_{i-1}+B_y\)
构造矩阵分别维护\(a_ib_i,a_i,b_i,A_yB_y,A_y,B_y,S_i\)
\[ \begin{bmatrix} a_ib_i \\ a_i \\ bi \\ A_yB_y \\ A_y \\ B_y \\ S_i\\ \end{bmatrix} = \begin{bmatrix} A_xB_x & A_xB_y & A_yB_x & 1 & 0 & 0 & 0 \\ 0 & A_x & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & B_x & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} a_{i-1}b_{i-1} \\ a_{i-1} \\ b_{i-1} \\ A_yB_y \\ A_y \\ B_y \\ S_{i-1}\\ \end{bmatrix} \]
那么\(S_n\)即为所求

#include
#define rep(i,j,k) for(register int i=j;i<=k;i++)#define println(a) printf("%lld\n",(ll)a)using namespace std;typedef long long ll;const ll mod = 1e9+7;ll read(){ ll x=0,f=1;register char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}struct Matrix{ ll mt[9][9],r,c; void init(int rr,int cc,bool flag=0){ r=rr;c=cc; memset(mt,0,sizeof mt); if(flag) rep(i,1,r) mt[i][i]=1; } Matrix operator * (Matrix rhs){ Matrix ans; ans.init(r,rhs.c); rep(i,1,r){ rep(j,1,rhs.c){ int t=max(r,rhs.c); rep(k,1,t){ ans.mt[i][j]+=(mt[i][k]*rhs.mt[k][j])%mod; ans.mt[i][j]=(ans.mt[i][j])%mod; } } } return ans; }};Matrix fpw(Matrix A,ll n){ Matrix ans;ans.init(A.r,A.c,1); while(n){ if(n&1) ans=ans*A; n>>=1; A=A*A; } return ans;}ll a0,ax,ay,b0,bx,by;ll n;ll bas2[8],base[8][8];int main(){ while(cin>>n){ cin>>a0>>ax>>ay; cin>>b0>>bx>>by; if(n==0){ println(0); continue; } bas2[1]=(a0%mod)*(b0%mod)%mod;bas2[2]=a0%mod;bas2[3]=b0%mod;bas2[4]=(ay%mod)*(by%mod)%mod; bas2[5]=ay%mod;bas2[6]=by%mod; bas2[7]=0; memset(base,0,sizeof base); base[1][1]=(ax%mod)*(bx%mod)%mod;base[1][2]=(ax%mod)*(by%mod)%mod;base[1][3]=(ay%mod)*(bx%mod)%mod;base[1][4]=1; base[2][2]=ax%mod;base[2][5]=1; base[3][3]=bx%mod;base[3][6]=1; base[4][4]=1; base[5][5]=1; base[6][6]=1; base[7][1]=1;base[7][7]=1; Matrix A; A.init(7,7); rep(i,1,7)rep(j,1,7) A.mt[i][j]=base[i][j]; Matrix b; b.init(7,1); rep(i,1,7) b.mt[i][1]=bas2[i]; Matrix res=fpw(A,n)*b; println(res.mt[7][1]); } return 0;}

转载于:https://www.cnblogs.com/caturra/p/8453066.html

你可能感兴趣的文章
KTV项目总结
查看>>
Java序列化与反序列化
查看>>
windows eclipse IDE打开当前类所在文件路径
查看>>
memcache服务器端参数说明
查看>>
java动态生成验证码
查看>>
SQL SERVER 查询性能优化——分析事务与锁(一)
查看>>
WCF学习之旅—请求与答复模式和单向模式(十九)
查看>>
oracle权限
查看>>
Python 教程阅读笔记(十):标准库一瞥(续)
查看>>
[转] 演示Flash Text Engine(FTE) 的baseline相关属性
查看>>
Java - 35 Java 实例
查看>>
为Liferay开发应用程序
查看>>
安卓绘图引擎
查看>>
写一篇 Bootstrap弹窗确认的文章。本周完成
查看>>
【转】Sublime text 3 中文文件名显示方框怎么解决
查看>>
【数论】洛谷P1313计算系数
查看>>
台湾好市多概述
查看>>
tar、gzip、unzip命令的详细使用方法备忘
查看>>
hdu 1025
查看>>
jar war ear
查看>>