POJ3150:Cellular Automaton
2024-10-15 18:05:03
题意看不懂加题目想不通,很菜。
n<=500个数围城环,每次操作对每个数Ai把与i在环上相距不超过d<n/2(包括Ai)的数加起来取模m<=1e6,求K<=1e7次操作后的环。
存在递推关系,构造矩阵吧!比如样例一很丑。
于是矩阵快速幂,n*n*n*logK,很慢。
这个矩阵比较奇怪,每一行都是上一行右移一位,而且每一行和每一列长得一样。也就是说我们只保存第一行就能知道整个矩阵长什么样。
而我们的时间主要浪费在a的相乘上,所以a只维护一行,计算答案时把a还原,更新一行的“a”时亦然,具体见代码。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
//#include<iostream>
using namespace std; int n,mod,d,K;
#define maxn 511
int a[maxn],b[maxn];
void mul(int *a,int *b,int *ans)
{
int t[maxn];
memset(t,,sizeof(t));
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
t[i]=(t[i]+1ll*a[j-i++(j-i>=?:n)]*b[j]%mod)%mod;
for (int i=;i<=n;i++) ans[i]=t[i];
}
int main()
{
scanf("%d%d%d%d",&n,&mod,&d,&K);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
memset(a,,sizeof(a));
for (int i=;i<=d+;i++) a[i]=;
for (int i=n;i>n-d;i--) a[i]=;
while (K)
{
if (K&) mul(a,b,b);
mul(a,a,a);
K>>=;
}
for (int i=;i<=n;i++) printf("%d ",b[i]);
return ;
}
最新文章
- Solr学习总结(一)Solr介绍
- golang mgo的mongo连接池设置:必须手动加上maxPoolSize
- Linux_权限
- JSON上
- zabbix使用sendEmail发送邮件报警
- linux C gcc -lm
- centOS安装openoffice
- [FileStream] 使用
- iOS键盘遮挡输入框,输入区域自动上移
- 尝试向树莓派3B引入Drbian 9 arm64-PART 1
- Django ORM详解
- mysql进阶(二十九)常用函数
- java对象深复制、浅复制(深拷贝、浅拷贝)的理解
- A计划 HDU - 2102
- mysql与mysqli的区别
- 转: Ogre实现无缝地图要改的地方 记下来 用的时候可以看
- Spring学习之路
- JDBC--数据库链接及相关方法的封装
- 菜鸟的Xamarin.Forms前行之路——从新建项目到APP上架各种报错问题解决方法合集(不定时更新)
- 配置nginx,Tomcat日志记录请求耗时
热门文章
- [BZOJ2761][JLOI2011]不重复数字 暴力
- jQuery选择器之表单对象属性筛选选择器
- 计算1至n的k次方的和
- Entity Framework + MySQL 使用笔记
- 创建线程的三种方式_Callable和Runnable的区别
- packet capture
- 优化UITableView
- vue 点击按钮弹窗,点击关闭按钮关闭弹窗。
- spring注解开发-容器创建全过程(源码)
- [LUOGU] P2920 [USACO08NOV]时间管理Time Management