2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂

字符串连接计数算法
本文介绍了一种基于图论和矩阵运算的算法,用于计算在特定字符转移规则下,长度不超过m的所有可能字符串的数量。通过将字符转移关系构造成图,并利用矩阵快速幂求解,实现了高效计算。

题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种。

思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么从a向b连边。用邻接矩阵保存这个图。。。然后可以发现长度为m的字符串实际上是这个图中的一条长度为m(经过m个点)的路。那么可以想到一个经典结论:一个图中的k长路的条数等于这个图的邻接矩阵求k次幂后每项的和。

但是这样我们并不能直接得到答案,每次只能求出所有m长路。这里有个技巧,可以求出一个矩阵的1到m次幂的和。也就是A+A^2+A^3+....+A^m,这个和最后再求每一个元素的和就是答案了。

转移矩阵是这样的:

A   0

I    I

这个矩阵直接求m次幂,用矩阵快速幂最终算法是O(n^3logm)的,最后左下角那个位置就是要求的幂和(可以手工验证下。。)

PS:比赛的时候把mod写在了三重循环里面,其实,这个2015的mod很有深意啊。。。把mod写到第二重循环里面就过了啊。。卧槽。取模这么慢。。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <map>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <set>
#include <cmath>
#define pb push_back
#define PB pop_back
#define fs first
//#define se second
#define sq(x) (x)*(x)
#define IINF (1<<29)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const int mod=2015;
int sz;
int mid[110][110];
struct matrix{
    int m[110][110];
    matrix(){
        memset(m,0,sizeof m);
    }
    void mul(const matrix &b){
        memset(mid,0,sizeof mid);
        for(int i=0;i<sz;i++){
            for(int j=0;j<sz;j++){
                for(int k=0;k<sz;k++){
                    mid[i][j]=(mid[i][j]+m[i][k]*b.m[k][j]);
                }
                mid[i][j]%=mod;
            }
        }
        for(int i=0;i<sz;i++){
            for(int j=0;j<sz;j++){
                m[i][j]=mid[i][j];
            }
        }
    }
    void selfmul(){
        memset(mid,0,sizeof mid);
        for(int i=0;i<sz;i++){
            for(int j=0;j<sz;j++){
                for(int k=0;k<sz;k++){
                    mid[i][j]=(mid[i][j]+m[i][k]*m[k][j]);
                }
                mid[i][j]%=mod;
            }
        }
        for(int i=0;i<sz;i++){
            for(int j=0;j<sz;j++){
                m[i][j]=mid[i][j];
            }
        }
    }
};
matrix qpow(matrix x,ll p){
    matrix ans;
    for(int i=0;i<sz;i++){
        ans.m[i][i]=1;
    }
    while(p>0){
        if(p&1) ans.mul(x);
        x.selfmul();
        p>>=1;
    }
    return ans;
}
const int maxm=1e5+300;
int T;
int n,m;
bool trans[60][60];
int main(){
    freopen("/home/files/CppFiles/in","r",stdin);
    //freopen("/home/files/CppFiles/out","w",stdout);
    cin>>T;
    while(T--){
        memset(trans,0,sizeof trans);
        scanf("%d%d",&n,&m);
        sz=n*2;
        for(int i=1;i<=n;i++){
            int k;
            scanf("%d",&k);
            for(int j=0;j<k;j++){
                int x;
                scanf("%d",&x);
                trans[i-1][x-1]=1;
            }
        }
        matrix tt;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                tt.m[i][j]=trans[i][j];
            }
        }
        for(int i=n;i<2*n;i++){
            int j=i-n;
            tt.m[i][j]=1;
            tt.m[i][i]=1;
        }
        matrix ans=qpow(tt,m);
        int sum=0;
        for(int i=n;i<2*n;i++){
            for(int j=0;j<n;j++)
            sum=(sum+ans.m[i][j])%mod;
        }
        printf("%d\n",(sum+1)%mod);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Cw-trip/p/4746307.html

### CRB矩阵的定义 CRB(Cramér-Rao Bound)矩阵是统计学中用于描述参估计精度下限的重要工具。在参估计问题中,假设随机变量 $ X $ 的概率密度函 $ f(x; \theta) $ 依赖于未知参 $ \theta $,并且定义 $ T(X) $ 为 $ \theta $ 的无偏估计量。CRB 提供了对 $ T(X) $ 的协方差矩阵的下界,即: $$ \text{Cov}(T(X)) \geq \mathbf{I}^{-1}(\theta) $$ 其中 $ \mathbf{I}(\theta) $ 是 Fisher 信息矩阵(FIM),其元素由以下公式定义: $$ \mathbf{I}_{ij}(\theta) = \mathbb{E} \left[ \frac{\partial}{\partial \theta_i} \log f(x; \theta) \cdot \frac{\partial}{\partial \theta_j} \log f(x; \theta) \right] $$ Fisher 信息矩阵反映了观测据对参的敏感性,而 CRB 矩阵则给出了估计量的最小可能方差下限。如果某个估计量的协方差达到了 CRB 的下限,则称该估计量为有效估计量 [^3]。 ### 在信号处理中的应用 CRB 矩阵广泛应用于信号处理领域,特别是在参估计问题中。例如,在方向估计(DOA 估计)中,CRB 可用于评估估计角度的精度下限。给定接收信号的二阶统计量(如自相关函和互相关函),CRB 提供了对估计误差的理论下界,从而可以比较不同估计方法的性能优劣 [^1]。 在 MIMO 系统中,CRB 被用来评估信道状态信息(CSI)估计的准确性。由于 MIMO 信道容量依赖于信道矩阵的精确估计,CRB 提供了一个衡量估计误差对系统性能影响的理论框架。通过分析 CRB,可以优化训练序列设计和接收机结构,以提高估计精度并最大化信道容量 [^2]。 ### 在通信系统中的应用 在无线通信系统中,CRB 被用于评估信道估计、信号检测和参估计的性能极限。例如,在 OFDM 系统中,CRB 可用于分析频率偏移估计的精度,并指导导频设计以提高估计性能。此外,在非线性信道模型中,CRB 有助于评估信道参估计的鲁棒性,尤其是在存在非理想信道状态信息的情况下 [^2]。 在实际应用中,CRB 还可以用于指导算法设计。例如,在用户检测问题中,CRB 提供了对用户信号分离精度的理论下界,从而帮助设计更高效的检测算法。对于具有记忆性的信道,CRB 的计算方法会考虑时间相关性,从而更准确地反映实际系统的性能限制 [^3]。 ### 示例代码 以下是一个简单的 Python 示例,用于计算高斯分布下均值估计的 CRB: ```python import numpy as np def cramer_rao_bound(mean, var, n_samples): # Fisher信息量 fisher_info = n_samples / var # CRB crb = 1 / fisher_info return crb # 参设置 mean_true = 0.0 var_true = 1.0 n_samples = 1000 # 计算CRB crb_value = cramer_rao_bound(mean_true, var_true, n_samples) print(f"CRB for mean estimation: {crb_value}") ``` 该代码计算了高斯分布下均值估计的 CRB,并输出结果。此示例可用于理解 CRB 在参估计中的基本应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值