成群的细菌
来源:互联网 发布:光谷数据 编辑:程序博客网 时间:2024/04/28 03:31
题意(原题):
n个数,m个操作,操作分6种,时间t。每刻进行一个操作,循环进行。 求最后每个数的值。
操作分别有清空、翻多倍、给另一个数加上某数的值、清空某数并给另一个数加上某数的值、第i个数的值变为第i+1个的值(n变为1的值)。思路:
类似点的变换但还需要用到矩阵快速幂。代码:
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#define GETMOD %Modusing namespace std;long long n,m,t,Mod;char ss[10];struct node{ long long xcnt,ycnt,a[110][110]; node() { xcnt=ycnt=0;memset(a,0,sizeof(a)); } void setxy(long long x,long long y) { xcnt=x;ycnt=y; }}opts[21];node cf(node x,node y){ node ans;ans.setxy(x.xcnt,y.ycnt); for(long long i=1;i<=ans.xcnt;i++) for(long long j=1;j<=ans.ycnt;j++) for(long long k=1;k<=x.ycnt;k++) ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j]GETMOD)GETMOD; return ans;}node dw(long long x){ node ans;ans.setxy(x,x); for(long long i=1;i<=x;i++)ans.a[i][i]=1; return ans;}node sw(long long x){ node ans;ans.setxy(n,n); for(long long i=1;i<=n;i++) if(i!=x)ans.a[i][i]=1; return ans;}node fl(long long x,long long y){ node ans;ans.setxy(n,n); for(long long i=1;i<=n;i++) if(i!=x)ans.a[i][i]=1; else ans.a[i][i]=y; return ans;}node fz(long long x,long long y){ node ans;ans.setxy(n,n); for(long long i=1;i<=n;i++)ans.a[i][i]=1; ans.a[y][x]=1; return ans;}node zy(long long x,long long y){ node ans;ans.setxy(n,n); for(long long i=1;i<=n;i++)if(i!=x)ans.a[i][i]=1; ans.a[y][x]=1; return ans;}node jh(long long x,long long y){ node ans;ans.setxy(n,n); for(long long i=1;i<=n;i++)if(i!=x&&i!=y)ans.a[i][i]=1; ans.a[x][y]=1; ans.a[y][x]=1; return ans;}node alljh(){ node ans;ans.setxy(n,n);ans.a[1][n]=1; for(long long i=1;i<=n;i++)ans.a[i][i-1]=1; return ans;}node power(node x,long long k){ node ans=dw(x.xcnt); while(k) { if(k&1)ans=cf(ans,x); x=cf(x,x); k/=2; } return ans;}int main(){ node opt; scanf("%lld%lld%lld%lld",&n,&m,&t,&Mod); for(long long i=1;i<=m;i++) { long long x,y; scanf("%s%lld%lld",ss+1,&x,&y); if(ss[1]=='d') opts[i]=sw(x); if(ss[1]=='r') opts[i]=fl(x,y); if(ss[1]=='c') opts[i]=fz(y,x); if(ss[1]=='t') opts[i]=zy(y,x); if(ss[1]=='s') opts[i]=jh(x,y); if(ss[1]=='m') opts[i]=alljh(); if(i==1)opt=opts[i]; else opt=cf(opts[i],opt); } opt=power(opt,t/m); for(long long i=1;i<=t%m;i++) opt=cf(opts[i],opt); node ans;ans.setxy(n,1); for(long long i=1;i<=n;i++)ans.a[i][1]=1; ans=cf(opt,ans); for(long long i=1;i<=n;i++)printf("%lld ",ans.a[i][1]); return 0;}
阅读全文
0 0
- 成群的细菌
- [caioj 1483,利用矩阵乘法解决的经典题目五]成群的细菌
- 细菌的繁殖
- COJ_2040_成群的触手(双向dp)
- 你的细菌就是你
- 技术人员“成群”是IT力量振兴的标志
- 技术成群(SNS)的运营思考(一)
- 技术成群(SNS)的运营思考(二)
- 技术成群(SNS)的运营思考(三)
- 基于Sketch.js 模拟成群的蝌蚪运动
- 儿女成群
- ZJUOJ1293——细菌的繁殖
- 来自MSDN的细菌觅食优化算法
- 基于QT的小游戏-细菌病毒战
- 神一样的二哥养细菌(难题)
- 面对好吃的,细菌也挑食
- HDU 1057 模拟细菌的变化
- OJ 30之细菌的繁殖
- 简单说 通过CSS的滤镜 实现 火焰效果
- C语言字符串操作总结大全
- C/C++ --- 全局变量初始化总结
- JS按照特定的条件对数组进行归类
- MaxCompute2.0 对开源系统的支持与融合
- 成群的细菌
- gitlab 搭建
- @NotEmpty、@NotBlank、@NotNull的区别
- QT数据库封装类-支持多线程
- JavaWeb学习笔记—Tomcat端口修改
- WebView的使用
- OpenGL学习: 反走样初步(Anti-aliasing basic)
- 判断该list集合里面是否有连续的数字
- springmvc 配置多视图(jsp,freemarker,HTML等)