摘要:以F[i][j]表示长度为i的pendant,用了j种珍珠,所构成的方案数,则F[i][j]=F[i-1][j]*j+F[i-1][j-1]*(k-j+1)优化的方法是使用矩阵来做。将F[i-1]到F[i]的转移用矩阵来描述,相当于一个k*k的线性变换矩阵。因此F[i]=A*F[i-1],这里A是转移矩阵,即F[i]=Ai-1*F[1],所以F[1]+…+F[n]=A0*F[1]+…+An-1*F[1]=(E+A+A2+…+An-1)*F[1]。
阅读全文
摘要:离散+二分解题思路:求t1->t2天内,v1->v2一共有多少条的路径。就是要用到离散数学的可达矩阵的n次幂各元素的值就是经过n条路可以到达该点。所以说这道题说白了就是叫你求 A^t1+a^(t1+1)+……A^(t2),输出v1,v2该元素的值模2008(注意负数的处理).所以就是要用到矩阵降幂+二分求和。
阅读全文
摘要:首项是:A^b 公比是:A^k 项数是:N 因为矩阵的加法对乘法也符合分配律,我们提出一个A^b来,形成这样的式子: A^b*( I + A^k + (A^k)^2 + .... + (A^k)^(N-1) ) A^b 和 A^k 显然都可以用我们之前说过的方法计算出来,这剩下一部分累加怎么解决呢 简单起见,设A^k=B 要求 G(N)=I + ... + B^(N-1),设i=N/2 若N为偶数,G(N)=G(i)+G(i)*B^i 若N为奇数,G(N)=I+ G(i)*B + G(i) * (B^(i+1))
阅读全文
摘要:pell方程:x^2-d*y^2=1矩阵连乘
阅读全文
摘要:矩阵连乘,或其他方法。//(s[n-1],a[n]^2,a[n]*a[n-1],a[n-1]^2)=(s[n-2],a[n-1]^2,a[n-1]*a[n-2],a[n-2]^2)*A//A=|1 0 0 0 |// |1 x^2 x 1 |// |0 2*x*y y 0 |// |0 y^2 0 0 |灵活想出公式!
阅读全文
摘要:矩阵连乘注意:for(i=1;i<=n;i++) map[i][i]=1;代码:#include<iostream>#include<fstream>using namespace std;int n;long long m;char c[101][101][22];char c1[101][22];int num[101];int a[101];int map[101][101],map1[101][101],map2[101][101];void solve(long long s){ int i,j,k; if(s==1) { for(i=1;i<=n
阅读全文
摘要:自动机+矩阵乘。代码:#include<iostream>#include<fstream>using namespace std;struct e{ int p[5]; int end;}trie[101];int m,K,n;int hash[128];int state=1;long long s;int f[101];void build(char c[]){ int i,j=0,k; for(i=1;;) { if(trie[i].p[hash[c[j]]]==0) trie[i].p[hash[c[j]]]=++state; i=trie[i].p[hash
阅读全文
摘要:矩阵乘法,运用循环矩阵性质。代码:#include<iostream>#include<fstream>#include<cmath>using namespace std;long long map[501][501],map1[501][501],map2[501][501];long long m,d;long long k;long long a[501],b[501];int n;void solve(long long k){ long long i,j; if(k==1) { for(i=1;i<=n;i++) for(j=1;j<
阅读全文
摘要:矩阵乘法。(a[n],a[n+1],a[n+2])=(a[0],a[1],a[2])*A^n.代码:#include<iostream>#include<fstream>using namespace std;int a[110];int map[110][110],map1[110][110],map2[110][110];int n;long long m;void solve(long long m){ int i,j,k; if(m==1) for(i=1;i<=n;i++) for(j=1;j<=n;j++) map1[i][j]=map[i][j
阅读全文