【数学&矩阵加速】hihocoder1555 四次方根
2018-01-15 16:26
381 查看
题目描述:
当 HungryBacon 还是个小学生的时候,体育老师就告诉过他,求四次方程的根是非常简单的。小 HungryBacon 很聪明,并算出了方程 x4+ax3+bx2+cx+d=0的四个根x1, x2, x3, x4。紧接着,他就找他的密友小 TinkEngineer 对答案,他们对答案的方式是计算 xn1 + xn2 + xn3 + xn4。然而,小 TinkEngineer 急着和女朋友约会,所以就让你来帮忙。给出a,b,c,d求(xn1 + xn2 + xn3 + xn4)mod(109+7)
分析:
这里需要用到韦达定理:很显然我们需要求的就是Sn
知道这些还不够,还必须求出前3项,前三项满足以下公式:
以下证明由数竞大佬周亮提供:
将原方程写为:(x−x1)(x−x2)(x−x3)(x−x4)=0
拆开括号,得x4−(x1+x2+x3+x4)x3+(x1x2+x1x3+x1x4+x2x3+x2x4+x3x4)x2−(x1x2x3+x1x2x4+x1x3x4+x2x3x4)x+x1x2x3x4=0
首先得到x1+x2+x3+x4=−a
(x1+x2+x3+x4)2−2x1x2−2x1x3...=a2−2b=x21+x22+x23+x24
最后,(x21+x22+x23+x24)(x1+x2+x3+x4)=x31+x32+x33+x34+x1x22+x1x23+x1x24+x2x21...
由x1x22+x1x23+x1x24+x2x21...=−ab+3c
最终得到x31+x32+x33+x34=(−a)(a2−2b)+ab−3c=−a3+3ab−3c
综上:x1+x2+x3+x4=−a
x21+x22+x23+x24=a2−2b
x31+x32+x33+x34=−a3+3ab−3c
知道这些开外挂获得的知识后,可以得到一个递推矩阵:
−a−b−c−d100001000010(1)
再将这个矩阵快速幂以求出答案。
#include<cstdio> #include<cstring> #include<cmath> #define SF scanf #define PF printf #define MAXN 1010 #define MOD 1000000007 using namespace std; struct node{ long long a[5][5]; node operator * (const node & x) const{ node b; memset(b.a,0,sizeof b.a); for(int i=0;i<4;i++) for(int j=0;j<4;j++) for(int k=0;k<4;k++){ b.a[i][j]+=a[i][k]*x.a[k][j]; b.a[i][j]%=MOD; } return b; } }st; node fsp(long long x){ if(x==1){ return st; } node a=fsp(x/2ll); a=a*a; if(x%2ll==1) a=a*st; return a; } long long n,s[5],c[5]; int t; int main(){ SF("%d",&t); while(t--){ SF("%lld",&n); for(int i=1;i<=4;i++) SF("%lld",&c[i]); c[1]=(MOD+c[1])%MOD; c[2]=(MOD+c[2])%MOD; c[3]=(MOD+c[3])%MOD; c[4]=(MOD+c[4])%MOD; for(int i=1;i<=4;i++){ s[i]=0; s[0]=i; for(int j=1;j<=i;j++) s[i]=(s[i]+c[j]*s[i-j])%MOD; s[i]=MOD-s[i]; }//之前看的一种写法,与题解给出的公式是等效的 if(n<=4){ PF("%lld\n",s %MOD); } if(n>4){ n-=4; memset(st.a,0,sizeof st.a); st.a[0][0]=MOD-c[1]; st.a[0][1]=MOD-c[2]; st.a[0][2]=MOD-c[3]; st.a[0][3]=MOD-c[4]; st.a[1][0]=1; st.a[2][1]=1; st.a[3][2]=1; node res=fsp(n); long long ans=0; for(int i=1;i<=4;i++) ans=(ans+s[i]*res.a[0][4-i])%MOD; PF("%lld\n",ans); } } }
相关文章推荐
- hihocoder 1555 四次方根(矩阵快速幂)
- [HIHO1555] 四次方根(递推,容斥,矩阵快速幂)
- POJ 2778 DNA Sequence && AC自动机 矩阵 矩阵加速
- DP·矩阵加速
- [BZOJ 2326] HNOI 2011 数学作业 · 矩阵乘法
- HDU-4565 So Easy!(数学&&矩阵快速幂)
- [SPOJ SPP] Recursive Sequence (Version II) && 矩阵加速
- hihoCoder 1151 : 骨牌覆盖问题·二 矩阵快速幂
- [BZOJ2326][HNOI2011]数学作业 && 分段矩阵
- BZOJ2326: [HNOI2011]数学作业【矩阵加速递推】
- 【简单数学&DP】闰年计数&回文串计数 _Hihocoder战场 @ 编程之美2015资格赛
- HDU 4087 三维坐标旋转(仿射变换) 矩阵加速 && 2011 Asia Beijing Regional Contest
- LOJ1070:Algebraic Problem(矩阵快速幂 & 数学 a^n+b^n)
- hihoCoder 1143 : 骨牌覆盖问题·一 矩阵快速幂
- HDU 5895&&2016 ACM/ICPC Asia Regional Shenyang Online1004 Mathematician QSC [矩阵加速+欧拉降幂]【数论】
- 【矩阵加速】[BZOJ2326][HNOI2011]数学作业
- hihoCoder 1473 小Ho的强迫症 && qdu 韬韬说蛤蛤蛤(基础gcd)
- hpuoj 【1154】两堆硬币【数学】&&【思维】
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
- 数学-矩阵计算(4)两种布局