poj 3150 Cellular Automaton

简介: 点击打开poj 3150 思路: 矩阵快速幂 分析: 1 题目给定n个数每个数在0~m-1之内,题目规定两个数之间的距离为min(|i-j| , n-|i-j|)。

点击打开poj 3150

思路: 矩阵快速幂

分析:

1 题目给定n个数每个数在0~m-1之内,题目规定两个数之间的距离为min(|i-j| , n-|i-j|)。现在给定d和k,表示做k次的变换,每一次变换过后每个数变成了一个新的数。这个新的数等于和它距离小于等于d的所有数的和%m

2 这题和之前做的两道题很像hdu2276 和 FZU1692,都是属于循环同构的问题

   那么我们先来看一下每个数在做一次变换过后变成什么。因为要距离小于等于d,第一种|i-j| = d , 则j = i+d , 第二种情况n-|i-j| = d , 因此 j = n-d+i 。

   第一个数等于 = num[1]+num[2]+....+num[d+1] + num[n-d+1]+...+num[n]

   第二个数等于 = num[2]+....+num[d+2] + num[n-d+2]+...+num[n]

   ..............................................................................................................

3 因为这里的矩阵是循环同构的,因此我们只要求出第一行,剩下的我们就可以根据前一行推出。这样就把矩阵的乘法的复杂度降到了O(n^2)


代码:

/************************************************
 * By: chenguolin                               * 
 * Date: 2013-08-31                             *
 * Address: http://blog.csdn.net/chenguolinblog *
 ************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long int64;
const int N = 505; 

int n , MOD , d , k;
int arr[N];

struct Matrix{
    int64 mat[N][N];
    Matrix operator*(const Matrix &m)const{
        Matrix tmp;
        for(int i = 1 ; i <= n ; i++){
            tmp.mat[1][i] = 0;
            for(int j = 1 ; j <= n ; j++)
                tmp.mat[1][i] += mat[1][j]*m.mat[j][i]%MOD;
            tmp.mat[1][i] %= MOD;
        }
        for(int i = 2 ; i <= n ; i++){
            tmp.mat[i][1] = tmp.mat[i-1][n];
            for(int j = 2 ; j <= n ; j++)
                tmp.mat[i][j] = tmp.mat[i-1][(j-1+n)%n];
        }
        return tmp; 
    }
};

void init(Matrix &m){
    memset(m.mat , 0 , sizeof(m.mat));
    for(int i = 1 ; i <= d+1 ; i++)
        m.mat[1][i] = 1;
    for(int i = n-d+1 ; i <= n ; i++)
        m.mat[1][i] = 1;
    for(int i = 2 ; i <= n ; i++){
        m.mat[i][1] = m.mat[i-1][n];
        for(int j = 2 ; j <= n ; j++)
            m.mat[i][j] = m.mat[i-1][(j-1+n)%n];
    }
}

void Pow(Matrix &m){
    Matrix ans;
    memset(ans.mat , 0 , sizeof(ans.mat));
    for(int i = 1 ; i <= n ; i++)
        ans.mat[i][i] = 1;
    while(k){
        if(k&1)
            ans = ans*m;
        k >>= 1;
        m = m*m;
    }
    for(int i = 1 ; i <= n ; i++){
        int64 sum = 0;
        for(int j = 1 ; j <= n ; j++)
            sum += ans.mat[i][j]*arr[j]%MOD;
        if(i > 1) printf(" ");
        printf("%lld" , sum%MOD);
    }
    puts("");
}

int main(){
    Matrix m;
    while(scanf("%d" , &n) != EOF){
        scanf("%d%d%d" , &MOD , &d , &k);
        for(int i = 1 ; i <= n ; i++)
            scanf("%d" , &arr[i]);
        init(m);
        Pow(m);
    }    
    return 0;
}




目录
相关文章
|
存储 前端开发 PHP
构建一个简单的网站,包括用户注册、登录功能
构建一个简单的网站,包括用户注册、登录功能
1034 1
|
7月前
|
计算机视觉
ROS2错误排查:解决cv_bridge与opencv版本不匹配问题。
要记住,这只是一种可能的解决方式,你可能还需要针对你的特定问题进行其他操作。如果遇到任何问题,记住,遇到困难不要灰心,继续把问题当作一个冒险,勇敢地前行。
561 92
|
11月前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
人工智能
LangChain:1. Prompt基本使用
LangChain:1. Prompt基本使用
570 1
|
JSON JavaScript 数据格式
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
|
存储 数据挖掘
YUV色彩空间
本文介绍 YUV存储格式,什么是色调?什么是色饱和度?人类视觉系统是如何感知YUV的?YUV比RGB好在哪里
490 0
|
存储 负载均衡 Cloud Native
【微服务系列笔记】Nacos
Nacos 是阿里巴巴开源的项目,用于构建云原生应用的动态服务发现、配置管理和服务管理平台。它支持动态服务发现、服务配置、服务元数据和流量管理,旨在更敏捷和方便地构建、交付和管理微服务平台。可作为注册中心与配置中心。
457 5
|
人工智能 算法 JavaScript
【简历优化平台-06】为什么很多简历必须写项目经验?有的简历没有项目经验?
【简历优化平台-06】为什么很多简历必须写项目经验?有的简历没有项目经验?
|
机器学习/深度学习 编解码 人工智能
什么样才算好图——从生图模型质量度量方法看模型能力的发展(下)
什么样才算好图——从生图模型质量度量方法看模型能力的发展(下)
884 1
|
前端开发 JavaScript Java
Springboot静态资源访问、上传、回显和下载
Springboot静态资源访问、上传、回显和下载
1320 0
Springboot静态资源访问、上传、回显和下载