vijosP1049 送给圣诞夜的礼品
来源:互联网 发布:周深 身骑白马知乎 编辑:程序博客网 时间:2024/06/11 13:38
vijosP1049 送给圣诞夜的礼品
链接:https://vijos.org/p/1049
【思路】
快速幂+矩阵转换。
将m次矩阵的转换看作是一次快速幂中的乘法操作,这样可以用O(log(k/m))的时间求出矩阵进行k/m次操作后的结果,然后把剩下的k%m次矩阵转换补上即可。
【代码】
1 #include<iostream> 2 #include<cstring> 3 #define FOR(a,b,c) for(int a=(b);a<=(c);a++) 4 using namespace std; 5 6 const int maxn = 100+10; 7 8 int op[11][maxn]; 9 int _hash[maxn],tmp[maxn],tmp2[maxn],ans[maxn];10 int n,m,k;11 12 void calc(int*A,int*B) { //据B操作改变A 13 FOR(i,1,n) tmp2[i]=A[B[i]];14 FOR(i,1,n) A[i]=tmp2[i];15 }16 17 int main() {18 ios::sync_with_stdio(false);19 cin>>n>>m>>k;20 FOR(i,1,m) FOR(j,1,n) cin>>op[i][j];21 22 FOR(i,1,n) _hash[i]=ans[i]=i; //init23 24 FOR(i,1,m) calc(_hash,op[i]); //calc_hash25 26 int T=k/m; k %= m;27 28 memcpy(&tmp,&_hash,sizeof(_hash)); //tmp=129 while(T) {30 if(T&1) calc(ans,tmp); //ans*=tmp31 calc(tmp,tmp); //tmp*=tmp32 T>>=1;33 }34 FOR(i,1,k) calc(ans,op[i]);35 36 FOR(i,1,n) cout<<ans[i]<<" ";37 return 0;38 }
0 0
- vijosP1049 送给圣诞夜的礼品
- 送给圣诞夜的礼品
- vijos1049 送给圣诞夜的礼品
- vijos 1049 送给圣诞夜的礼品
- 【vijos1049】【矩阵乘法】送给圣诞夜的礼品
- vijos1049——送给圣诞夜的礼品
- VIJOS 1049 送给圣诞夜的礼品(矩阵快速幂)
- [Vijos 1049] 送给圣诞夜的礼品 · 矩阵乘法
- vijos1049送给圣诞夜的礼品 矩阵快速幂
- voj 1049 送给圣诞夜的礼品 矩阵快速幂
- 矩阵——vijos1049送给圣诞夜的礼品
- vijos1049 送给圣诞夜的礼品(矩阵倍增)
- 矩阵十大经典题目之四- VOJ1049-送给圣诞夜的礼品
- 矩阵经典题目四:送给圣诞夜的礼品(使用m个置换实现对序列的转变)
- Vijos1051. 送给圣诞夜的极光
- [vijos1048]送给圣诞夜的贺卡
- 【搜索\位集合】送给圣诞夜的贺卡
- vijos 1051 送给圣诞夜的极光
- vijosP1115 火星人
- vijosP1137 组合数
- MacPorts卡在"正在运行软件包脚本"解决方法
- Vijos P1060 盒子
- vijosP1210 盒子与球
- vijosP1049 送给圣诞夜的礼品
- vijosP1092 全排列
- vijosP1289 老板娘的促销方案
- vijosP1413 Valentine’s Present
- HTTPS学习(一):工作过程
- vijosP1371 方程的解
- vijosP1388 二叉树数
- vijosP1687 细菌总数
- 自定义ZbarView