Jzzhu and Sequences(CF #257 Div. 2)

递归数列求值
本文介绍了一道关于数列求值的问题,并提供了两种解决方法:一是通过观察规律找到周期性,二是使用矩阵快速幂的方法。这两种方法都可以有效避免直接递归导致的时间复杂度过高的问题。
部署运行你感兴趣的模型镜像

一道规律题,比较简单。

题目大意:给出一个公式 f [ n ]=f [ n-1 ] - f [ n-2 ],然后给出 f [ 1 ]和f [ 2 ]的值,以及n,求f [ n ]。附链接:http://codeforces.com/problemset/problem/450/B

大体思路:因为所给的n很大,所以直接循环n次肯定超时。第一种方法,可以找一下规律,一般公式题都有规律可循,第二种,用矩阵快速幂暴力破解。第一种,通过对样例 1给出的两个数求 f [ n ],可以发现循环节是6,然后此时由公式 f [ 3 ] = f [ 2 ] - f [ 1 ] 再来推,可以发现第6次的时候得到的 f [ 6 ] = f [ 2 ] - f [ 1 ]。

1. 找规律:

#include<iostream>
using namespace std;

int main(){
    int x,y;
    while(cin>>x>>y){
        int n;
        cin>>n;
        int f1=x;
        int f2=y;
        int f3;
        if(n==1){
            if(x<0)
                cout<<(1000000007+x)<<endl;
            else
                cout<<x%1000000007<<endl;
        }
        else if(n==2){
            if(y<0)
                cout<<(1000000007+y)<<endl;
            else
                cout<<y%1000000007<<endl;
        }
        else{
            n=(n-3)%6+3;
            for(int i=3;i<=n;i++){
                f3=f2-f1;
                if(f2<0)
                    f2=f2+1000000007;
                else
                    f2=f2%1000000007;
                f1=f2;
                if(f3<0)
                    f3=f3+1000000007;
                else
                    f3=f3%1000000007;
                f2=f3;
            }
            if(f3<0)
                cout<<(f3+1000000007)<<endl;
            else
                cout<<f3%1000000007<<endl;
        }
    }
    return 0;
}
2. 矩阵快速幂,这个方法有固定的步骤,把矩阵构造出来就好了。代码如下:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=2;
const long long mod=1000000007;
struct Matrix{
    long long mat[maxn][maxn];
};
Matrix unit;
Matrix mul(Matrix a,Matrix b){
    Matrix c;
    for(int i=0;i<maxn;i++)
        for(int j=0;j<maxn;j++){
            c.mat[i][j]=0;
            for(int k=0;k<maxn;k++){
                c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                c.mat[i][j]%=mod;
            }
    }
    return c;
}
Matrix mat_pow(Matrix a,long long p){
    Matrix temp=unit;
    while(p){
        if(p%2)
            temp=mul(temp,a);
        a=mul(a,a);
        p/=2;
    }
    return temp;
}
int main(){
    memset(unit.mat,0,sizeof(unit.mat));
    for(int i=0;i<maxn;i++)
        unit.mat[i][i]=1;
    long long x,y,n;
    cin>>x>>y>>n;
    if(n==1){
        if(x<0)
            cout<<x+mod<<endl;
        else
            cout<<x%mod<<endl;
    }
    else if(n==2){
        if(y<0)
            cout<<y+mod<<endl;
        else
            cout<<y%mod<<endl;
    }
    else{
        Matrix A;      //初始矩阵,即包含f[1]、f[2]的矩阵
        A.mat[0][0]=x;
        A.mat[0][1]=y;
        A.mat[1][0]=A.mat[1][1]=0;
        Matrix C;     //系数矩阵
        C.mat[0][0]=0;
        C.mat[0][1]=-1;
        C.mat[1][0]=C.mat[1][1]=1;
        Matrix result=mat_pow(C,n-2);
        result=mul(A,result);
        if(result.mat[0][1]<0)
            cout<<result.mat[0][1]+mod<<endl;
        else
            cout<<result.mat[0][1]<<endl;
    }
}




您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在运行DAVIS2017评估脚本时,如果进度卡在“Evaluating sequences 0%”,这通常意味着评估过程中出现了某种阻塞或异常情况。以下是可能的原因及解决方法: ### 1. 数据路径配置问 确保所有输入数据路径(如图像路径、标注路径、预测结果路径)都已正确配置。如果路径不正确或文件缺失,脚本可能无法读取数据,从而导致卡顿。 - 检查`davis2017/evaluation/evaluation_method.py`中是否指定了正确的路径。 - 确保`DAVIS`数据集的目录结构符合官方要求,包括`JPEGImages`、`Annotations`、`ImageSets`等文件夹。 ### 2. 多进程或线程冲突 DAVIS2017评估脚本使用多进程处理多个视频序列,但在某些系统或环境中,多进程可能导致卡顿或死锁。 - 尝试将`num_workers`参数设置为`1`以禁用多进程,查看是否仍卡顿。可以在调用评估函数时修改该参数: ```python evaluate_method(dataset, num_workers=1) ``` ### 3. 内存不足 如果系统内存不足,评估过程可能因资源不足而卡住。特别是当处理高分辨率视频或大量序列时,内存需求会显著增加。 - 使用`top`或`htop`命令监控系统资源使用情况。 - 尝试减少同时处理的视频数量,或降低图像分辨率。 ### 4. 文件格式或内容错误 某些视频序列的图像或标注文件可能损坏或格式不正确,导致评估脚本在读取时卡住。 - 检查`ImageSets/2017/val.txt`或`trainval.txt`中的视频名称是否与`JPEGImages`和`Annotations`目录中的文件一致。 - 手动打开几个视频文件夹,确认图像和标注文件是否完整且可读。 ### 5. Python环境依赖问 DAVIS2017评估脚本依赖多个Python库(如`opencv-python`, `numpy`, `scikit-image`等),如果某些库版本不兼容,可能导致脚本异常。 - 确保使用官方推荐的Python环境和依赖版本。 - 可以尝试创建一个新的虚拟环境并重新安装依赖: ```bash conda create -n davis python=3.7 conda activate davis pip install -r requirements.txt ``` ### 6. 日志输出被禁用或未刷新 有时评估脚本的进度输出未及时刷新,给人以卡顿的错觉。 - 在评估脚本中查找进度条输出部分,确保每次更新后调用`sys.stdout.flush()`。 - 添加调试输出语句,确认脚本是否仍在运行: ```python import logging logging.basicConfig(level=logging.INFO) ``` ### 7. 操作系统兼容性问 在某些操作系统(如Windows)上运行DAVIS2017评估脚本时,可能会遇到多进程或路径处理的兼容性问- 尝试在Linux环境下运行评估脚本,尤其是Ubuntu系统。 - 如果必须在Windows上运行,可以尝试使用`WSL`(Windows Subsystem for Linux)来模拟Linux环境。 ### 8. 代码逻辑问 检查`evaluation_method.py`中是否存在潜在的死循环或条件判断错误。 - 查看`evaluate_sequences`函数中的循环逻辑,确保退出条件正确。 - 添加日志输出,确认脚本是否进入某个特定函数或循环。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值