zoukankan      html  css  js  c++  java
  • bnuoj 16493 Just Pour the Water(矩阵快速幂)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16493

    【题解】:矩阵快速幂

    【code】:

      1 #include <cstdlib>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <iostream>
      5 using namespace std;
      6 
      7 int N;
      8 struct matrix
      9 {
     10        double a[100][100];
     11 }origin,res;
     12 
     13 
     14 matrix multiply(matrix x,matrix y)
     15 {
     16        matrix temp;
     17        for(int i=1;i<=N;i++)
     18        {
     19                for(int j=1;j<=N;j++)
     20                {
     21                        double ans=0;
     22                        for(int k=1;k<=N;k++)
     23                        {
     24                                ans+=x.a[i][k]*y.a[k][j];
     25                        }
     26                        temp.a[i][j]=ans;
     27                }
     28        }
     29        
     30        return temp;
     31 }
     32 
     33 matrix calc(int n)
     34 {
     35      while(n)
     36      {
     37              if(n%2==1)
     38                     res=multiply(origin,res);
     39              origin=multiply(origin,origin);
     40              n/=2;
     41      }
     42      return res;
     43 }
     44 
     45 int main()
     46 {
     47     int t;
     48     scanf("%d",&t);
     49     while(t--)
     50     {
     51         int n;
     52         scanf("%d",&n);
     53         N=n;
     54         double x[100];
     55         int i,j;
     56         for(i=1;i<=n;i++)
     57         {
     58             scanf("%lf",&x[i]);
     59         }
     60         memset(origin.a,0,sizeof(origin.a));
     61         for(i=1;i<=n;i++)
     62         {
     63             int k;
     64             scanf("%d",&k);
     65             if(k==0) origin.a[i][i]=1.0;
     66             for(j=1;j<=k;j++)
     67             {
     68                 int p;
     69                 scanf("%d",&p);
     70                 origin.a[p][i]=1.0/k;
     71             }
     72         }
     73         memset(res.a,0,sizeof(res.a));
     74         for(i=1;i<=n;i++)
     75         {
     76             res.a[i][i]=1;
     77         }
     78         int m;
     79         scanf("%d",&m);
     80         calc(m);
     81         for(i=1;i<=n;i++)
     82         {
     83             double ans=0;
     84             for(j=1;j<=n;j++)
     85             {
     86                 ans+=res.a[i][j]*x[j];
     87             }
     88             if(i==1)
     89             {
     90                 printf("%.2lf",ans);
     91             }
     92             else
     93             {
     94                 printf(" %.2lf",ans);
     95             }
     96         }
     97         putchar(10);
     98 
     99     }
    100     return 0;
    101 }
  • 相关阅读:
    PHP
    Python语言特性
    Selenium2+python自动化
    Linux命令--系统管理
    Linux命令--网络管理
    Linux命令--压缩解压(简化版)
    Linux--压缩解压命令
    Linux命令--用户管理
    Linux命令--获取帮助
    Linux命令--权限管理
  • 原文地址:https://www.cnblogs.com/crazyapple/p/3351484.html
Copyright © 2011-2022 走看看