【矩阵快速幂】 Codeforces Round #291 (Div. 2) E. Darth Vader and Tree
2015-03-11 18:27
363 查看
附上CF的官方题解。。。
It's easy to realize that
, where
dp[i] is number of vertices, which are situated on a distance
i from the root, and
cnt[j] is number of children, which are situated on a distance
j. Answer
.
Let the dynamics condition
Let's build a transformation matrix of 101 × 101 size
Now, to move to the next condition, we need to multiply A by B. So, if matrix
C = A·Bx - 100, then the answer will be situated in the very right cell of this matrix. For
x < 100 we'll find the answer using dynamics explained in the beginning.
In order to find Bk let's use binary power.
It's easy to realize that
, where
dp[i] is number of vertices, which are situated on a distance
i from the root, and
cnt[j] is number of children, which are situated on a distance
j. Answer
.
Let the dynamics condition
Let's build a transformation matrix of 101 × 101 size
Now, to move to the next condition, we need to multiply A by B. So, if matrix
C = A·Bx - 100, then the answer will be situated in the very right cell of this matrix. For
x < 100 we'll find the answer using dynamics explained in the beginning.
In order to find Bk let's use binary power.
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 105 #define maxm 200005 #define eps 1e-7 #define mod 1000000007 #define INF 0x3f3f3f3f #define PI (acos(-1.0)) #define lowbit(x) (x&(-x)) #define mp make_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R #define pii pair<int, int> #pragma comment(linker, "/STACK:16777216") typedef long long LL; typedef unsigned long long ULL; //typedef int LL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} //head LL mat[maxn][maxn]; LL res[maxn][maxn]; LL mid[maxn][maxn]; LL cnt[maxn]; LL ans[maxn]; LL dp[maxn]; int n, x; void read() { int xx; scanf("%d%d", &n, &x); for(int i = 1; i <= n; i++) { scanf("%d", &xx); cnt[xx]++; } } void calc(int r) { int o = 101; while(r) { if(r % 2) { for(int i = 1; i <= o; i++) for(int j = 1; j <= o; j++) { LL t = 0; for(int k = 1; k <= o; k++) t = (t + res[i][k] * mat[k][j]) % mod; mid[i][j] = t; } memcpy(res, mid, sizeof mid); } for(int i = 1; i <= o; i++) for(int j = 1; j <= o; j++) { LL t = 0; for(int k = 1; k <= o; k++) t = (t + mat[i][k] * mat[k][j]) % mod; mid[i][j] = t; } memcpy(mat, mid, sizeof mid); r /= 2; } } void work() { dp[0] = 1; for(int i = 1; i <= 100; i++) for(int j = 1; j <= i; j++) dp[i] = (dp[i] + cnt[j] * dp[i - j]) % mod; for(int i = 0; i <= 100; i++) dp[101] = (dp[101] + dp[i]) % mod; for(int i = 1; i <= 101; i++) res[i][i] = 1; for(int i = 2; i <= 100; i++) mat[i][i-1] = 1; for(int i = 1; i <= 100; i++) mat[i][100] = mat[i][101] = cnt[101-i]; mat[101][101] = 1; if(x <= 100) { LL t = 0; for(int i = 0; i <= x; i++) t = (t + dp[i]) % mod; printf("%I64d\n", t); return; } calc(x - 100); LL t = 0; for(int i = 1; i <= 101; i++) { t = (t + dp[i] * res[i][101]) % mod; //printf("%d KKK\n", res[i][101]); } printf("%I64d\n", t); } int main() { read(); work(); return 0; }
相关文章推荐
- Codeforces 514E Darth Vader and Tree DP + 矩阵快速幂
- codeforces 514E E. Darth Vader and Tree(矩阵快速幂 )
- Codeforces 514E. Darth Vader and Tree DP+矩阵快速幂
- Codeforces Round #291 (Div. 2) E. Darth Vader and Tree(矩阵优化DP)
- Codeforces Round #341 (Div. 2) E. Wet Shark and Blocks(dp + 矩阵快速幂)
- Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树
- Codeforces Round #420 (Div. 2) Okabe and El Psy Kongroo[矩阵快速幂+细节处理]
- Codeforces Round #291 (Div. 2)E. Darth Vader and Tree——dp+矩阵快速幂
- Codeforces #341 div 2 E. Wet Shark and Blocks(矩阵快速幂)
- Codeforces Round #291 (Div. 2) E. Darth Vader and Tree 矩阵快速幂
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂+dp
- codeforces 514E E. Darth Vader and Tree(矩阵应用)
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo(矩阵快速幂)
- 矩阵快速幂DP Darth Vader and Tree : CodeForces - 514E
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵快速幂)
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
- Codeforces Round #257(Div. 2) B. Jzzhu and Sequences(矩阵快速幂)
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp
- Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo [矩阵快速幂]