Hdoj 1588 Gauss Fibonacci 【矩阵快速幂】

Gauss Fibonacci

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2584 Accepted Submission(s): 1078

Problem Description
Without expecting, Angel replied quickly.She says: “I’v heard that you’r a very clever boy. So if you wanna me be your GF, you should solve the problem called GF~. ”
How good an opportunity that Gardon can not give up! The “Problem GF” told by Angel is actually “Gauss Fibonacci”.
As we know ,Gauss is the famous mathematician who worked out the sum from 1 to 100 very quickly, and Fibonacci is the crazy man who invented some numbers.

Arithmetic progression:
g(i)=k*i+b;
We assume k and b are both non-nagetive integers.

Fibonacci Numbers:
f(0)=0
f(1)=1
f(n)=f(n-1)+f(n-2) (n>=2)

The Gauss Fibonacci problem is described as follows:
Given k,b,n ,calculate the sum of every f(g(i)) for 0<=i

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define LL __int64

struct node{
    LL num[3][3];
};
node e, a;
LL n, m, k, b;

node mul(node aa, node bb){
    node c;
    for(int i = 1; i < 3; ++i){
        for(int j = 1; j < 3; ++j){
            c.num[i][j] = 0;
            for(int k = 1; k < 3; ++k){
                c.num[i][j] = (c.num[i][j]+aa.num[i][k]*bb.num[k][j])%m;
            }
        }
    }
    return c;
}

node fa(node a, LL n){
    node b = e;
    while(n){
        if(n&1) b = mul(a, b);
        n >>= 1;
        a = mul(a, a);
    }
    return b;
}

node add(node aa, node bb){
    node c;
    for(int i = 1; i < 3; ++i){
        for(int j = 1; j < 3; ++j){
            c.num[i][j] = (aa.num[i][j]+bb.num[i][j])%m;
        }
    }
    return c;
}

node dg(node p, LL k){  //这里很巧
    if(k == 1) return p;
    else if(k&1) return add(dg(p, k-1), fa(p, k)); //这里就是A^(K-1)+A^k
    else return mul(dg(p, k>>1), add(fa(p, k>>1), e));//这里就是 A^k+A^(k>>1);
}

int main(){
    e.num[1][1] = e.num[2][2] = 1;
    e.num[1][2] = e.num[2][1] = 0;
    a.num[1][1] = a.num[1][2] = a.num[2][1] = 1; a.num[2][2] = 0;
    while(cin >> k >> b >> n >> m){
        node ak = fa(a, k);
        node ab = fa(a, b);
        node ans = dg(ak, n-1);
        ans = add(e, ans);
        ans = mul(ab, ans);
        cout << ans.num[1][2]<< endl;
    }
    return 0;
}
极化码(Polar Code)是由土耳其科学家Erdal Arıkan在2009年提出的一种新型纠错编码技术。它通过利用信道的极化现象,将虚拟信道分为误码率接近0和接近1/2的两类。在编码设计中,数据被放置在误码率极低的信道上,从而实现高效的数据传输。极化码的主要优势在于其理论编码容量能够达到香农限,并且构造方法较为简单。 MATLAB是一种功能强大的数学计算和编程工具,广泛应用于科学研究和工程领域。在极化码的研究中,MATLAB可用于构建编码和解码算法,模拟数据在不同信道条件下的传输效果,验证理论性能,并优化相关参数。 SC(Successive Cancellation,逐位取消)译码是极化码的基本解码方法。它从最可靠的比特开始,依次解码每个虚拟信道,且每个比特的解码结果会影响后续比特的解码,因为它们之间存在依赖关系。虽然SC译码的实现较为简单,但其计算复杂度较高,随着码长的增加,解码时间会线性增长。 SCL(Successive Cancellation List,逐位取消列表)译码是SC译码的改进版本。它通过引入列表机制,同时处理多个路径,从而增强了错误校正能力,并在一定程度上降低了错误率。与SC译码相比,SCL译码虽然需要消耗更多的计算资源,但能够提供更好的性能。 一个完整的MATLAB仿真资源通常包含以下内容: 编码模块:用于实现极化码的生成,包括码字构造和极化矩阵操作等。 信道模型:用于模拟各种通信信道,例如AWGN(加性高斯白噪声)信道或衰落信道。 SC/SCL译码模块:包含SC译码和SCL译码的算法实现。 误码率(BER)计算:通过比较发送和接收的码字,计算误码率,以评估编码性能。 性能曲线绘制:绘制误码率与信噪比(SNR)之间的关系曲线,展示不同译码策略的性能差异。 使用说明:指导用户如何运行仿真,理解代码结构,以及如何调整参数以进行自定义实验。 代码注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值