题目链接:http://poj.org/problem?id=3150

题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现在要求将所有的数都变换k次,得到的n个数的值。

思路:构造一个循环矩阵,以下这个矩阵是以样例1为例的循环矩阵。


我们发现n尽然达到了500,复杂度是n^3logk,过不了,我们发现这个矩阵长得很奇葩,每一行都是上一行后移一位得到,所以我们每个矩阵可以n^2算出一行,然后通过平移得到全部的矩阵。从而把n^3的矩阵乘法变成n^2,复杂度是n^2logk,就可以AC了,其他没有什么奇怪的操作。第一道循环矩阵题,算是涨姿势了,循环矩阵乘法模板记住了。

代码:

 //Author: xiaowuga
#include<iostream>
#include<cstring>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define N 505
using namespace std;
long long MOD;
typedef long long ll;
long long n,size;//第n项,矩阵大小
long long f[];
struct Matrix{
long long mat[N][N];
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
tmp.clear();
for(int i=;i<size;i++){
for(int j=;j<size;j++){
tmp.mat[][i]+=mat[][j]*m.mat[j][i]%MOD;
}
tmp.mat[][i]%=MOD;
}
for(int i=;i<size;i++){
for(int j=;j<size;j++)
tmp.mat[i][j]=tmp.mat[i-][(j+size-)%size];
}
return tmp;
}
}M,ANS;
Matrix ans;
void POW(Matrix m,ll k){
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<size;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
long long sum;
for(int i=;i<size;i++){
sum=;
for(int j=;j<size;j++){
sum+=ans.mat[i][j]*f[j]%MOD;
}
if(i==) cout<<sum%MOD;
else cout<<" "<<sum%MOD;
}
cout<<endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
long long d;
while(cin>>size>>MOD>>d>>n){
M.clear();
for(int i=;i<size;i++) cin>>f[i];
for(int i=;i<size;i++){
M.mat[i][i]=;
for(int j=;j<=d;j++){
M.mat[i][(i+j+size)%size]=;
M.mat[i][(i-j+size)%size]=;
}
}
for(int i=;i<size;i++){
for(int j=;j<size;j++) cout<<M.mat[i][j]<<' ';
cout<<endl;
}
POW(M,n);
}
return ;
}

最新文章

  1. 【MySQL】 查询某个数据库有多少张数据表
  2. PHP命名空间的作用、为什么使用命名空间?
  3. C#和Javascript的try…catch…finally的一点差别
  4. Java实验四和实验五
  5. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
  6. android 兼容性测试 CTS 测试过程(实践测试验证通过)
  7. JavaWeb学习记录(二十三)——文件上传与下载
  8. python 实例属性之单,双下划线
  9. 深入学习Heritrix---解析处理器(Processor)(转)
  10. HDU 4870 Rating (2014 Multi-University Training Contest 1)
  11. MVCC的一种实现方案
  12. 【Howie玩docker】-使用mono编译c#程序
  13. mysql步骤详解
  14. Nginx完整配置配置样例【官方版】
  15. windows安装xampp时出现,unable to realloc xxxxxxxx bytes
  16. Jexus 5.8.3正式发布:Asp.Net Core在Linux上最友好服务器平台
  17. 解决firefox不支持-webkit-line-clamp属性
  18. [SDOI2016]硬币游戏
  19. spark中map与flatMap的区别
  20. adb命令集合

热门文章

  1. 82. Single Number【easy】
  2. 每日英语:Investing the Downward Dog Way? Adviser Suggests Deep Breaths
  3. hive优化总结
  4. aix 常用命令
  5. JS学习笔记(2)--正则表达式获取指定字符串
  6. 运用 Range 对象处理 Word 文档内容
  7. oozie开发注意事项
  8. shell向python传参数
  9. Android应用双击返回键退出
  10. 002Maven_第一个Maven演示