矩陣入門 poj 3735

来源:互联网 发布:电脑网络接口类型 编辑:程序博客网 时间:2024/05/20 22:04
題目應該注意兩點:第一:矩陣op的生成可以進行模擬也可以利用矩陣乘法構造,第一種方案快一些。第二:題目op是一個稀疏矩陣,利用乘法的優化可以大大加快運算。原則上,這個乘法還可以更快,利用dp的思想用空間換時間即可。#include "cstdio"#include "cstring"#include "algorithm"using namespace std;#define MAX 100#define ET getchar()typedef long long ll;struct MAT{ll x[MAX+5][MAX+5];int step;}op;typedef struct MAT mat;mat mul(mat a,mat b){mat ans;int l=ans.step=a.step;memset(ans.x,0,sizeof(ans.x));for(int i=1;i<=l;i++){for(int j=1;j<=l;j++){if(a.x[i][j]){for(int k=1;k<=l;k++){ans.x[i][k]+=a.x[i][j]*b.x[j][k];}}}}return ans;}mat qpow(mat a,int n){mat ans=a;n--;while(n){if(n&1)ans=mul(ans,a);n>>=1;a=mul(a,a);}return ans;}void init(int sp){op.step=sp;for(int i=1;i<=sp;i++){for(int j=1;j<=sp;j++){op.x[i][j]=(i==j);}}}int main(){ll n,m,k;while(1){scanf("%lld%lld%lld",&n,&m,&k);if(n==0 && m==0 && k==0)break;getchar();init(n+1);char t;int id,id2;for(int i=1;i<=k;i++){scanf("%c",&t);getchar();if(t=='g'){scanf("%d",&id);for(int j=1;j<=n+1;j++){op.x[id][j]+=op.x[n+1][j];}}else if(t=='e'){scanf("%d",&id);for(int j=1;j<=n+1;j++){op.x[id][j]=0;}}else{scanf("%d%d",&id,&id2);if(id-id2)for(int j=1;j<=n+1;j++){//swap(op.x[id][j],op.x[id2][j]);int t=op.x[id][j];op.x[id][j]=op.x[id2][j];op.x[id2][j]=t;}}getchar();}if(m==0 || k==0){for(int i=1;i<=n;i++){printf("0 ");}printf("\n");continue;}op=qpow(op,m);for(int i=1;i<=n;i++){printf("%lld ",op.x[i][n+1]);}printf("\n");}return 0;}

0 0
原创粉丝点击