[BZOJ4002]JLOI2015有意义的字符串|矩阵乘法
2015-06-20 21:58
316 查看
题目和字符串有啥关系吗。。。
熟悉特征方程就容易发现这其实是一个a[n]=c1∗a[n−1]+c2∗a[n−2]a
=c_1*a[n-1]+c_2*a[n-2]这样的数列的通项的一部分,a[n]=(b+d√2)n+(b−d√2)na
=(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^n,其中c1=b,c2=d−b24c_1=b,c_2=\frac{d-b^2}{4},这样我们可以通过矩乘算出a[n]a
来。根据题目数据特点发现a[n]a
的后面项在(−0.5,0.5)(-0.5,0.5)之内,那么只有n为偶数且d!=b2d!=b^2时答案才是a[n]−1a
-1,否则是a[n]a
。。注意各种爆范围。。。
熟悉特征方程就容易发现这其实是一个a[n]=c1∗a[n−1]+c2∗a[n−2]a
=c_1*a[n-1]+c_2*a[n-2]这样的数列的通项的一部分,a[n]=(b+d√2)n+(b−d√2)na
=(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^n,其中c1=b,c2=d−b24c_1=b,c_2=\frac{d-b^2}{4},这样我们可以通过矩乘算出a[n]a
来。根据题目数据特点发现a[n]a
的后面项在(−0.5,0.5)(-0.5,0.5)之内,那么只有n为偶数且d!=b2d!=b^2时答案才是a[n]−1a
-1,否则是a[n]a
。。注意各种爆范围。。。
#include<cstdio> #include<iostream> #include<memory.h> #include<cmath> #define p 7528443412579576937ul #define ll unsigned long long using namespace std; struct ju{ ll a[2][2]; int n,m; }ans,t; ll b,d,n; ll mul(ll a,ll b) { if (b>a) swap(a,b); if (b==0) return 0ll; ll c=mul(a,b/2); c=c*2%p; if (b%2==1) c=(c+a)%p; return c; } ju operator*(ju a,ju b) { ju ans; memset(ans.a,0,sizeof(ans.a)); ans.n=a.n;ans.m=b.m; for (int i=0;i<a.n;i++) for (int j=0;j<a.m;j++) for (int k=0;k<b.m;k++) ans.a[i][k]=(ans.a[i][k]+mul(a.a[i][j],b.a[j][k]))%p; return ans; } ju pow(ju a,ll b) { if (b==1) return a; ju c=pow(a,b/2); c=c*c; if (b%2==1) c=c*a; return c; } int main() { cin>>b>>d>>n; if (n==1) {cout<<b;return 0;} if (n==0) {cout<<1;return 0;} t.a[0][0]=0ll;t.a[0][1]=1ll;t.a[1][0]=((d-b*b)/4)%p;t.a[1][1]=b%p; t.n=t.m=ans.n=2;ans.m=1; ans.a[0][0]=2;ans.a[1][0]=b%p; ans=pow(t,n-1)*ans; if (d!=b*b&&n%2==0) ans.a[1][0]=(ans.a[1][0]-1+p)%p; cout<<ans.a[1][0]; }
相关文章推荐
- BP算法与公式推导
- 协议转换器
- PageRank算法
- 向github、coding上提交项目
- LINUX下配置JDK环境变量
- Redis数据类型之SORTEDSET类型
- hdu 水题
- Coursera台大机器学习课程笔记3 – 机器学习的分类和机器学习的可能性
- Java collection class demo
- 端午
- 学编程为什么这么难?每个新手绝对要知道的那些事
- Spark编程指引(三)-----------------RDD操作,shuffle和持久化
- python批量处理
- 因特网的应用
- -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a
- 列表切片list slicing
- 《一个程序猿的生命周期》读后感
- Hibernate映射关系之_多对多
- 一步一步搭建Svn+Apache环境(附源码包)
- Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue