zoukankan      html  css  js  c++  java
  • uva11551矩阵快速幂

    题目看了半天没看懂,,就是把一个数列更新r次,每次更新就是计算和,就是每一个数,只要出现了的表号都要加上去,具体看代码

    矩阵快速幂实现加速

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=50+5,maxn=1<<10+5,inf=0x3f3f3f3f;
    
    struct Node{
       ll row,col;
       ll a[N][N];
    };
    Node mul(Node x,Node y)
    {
        Node ans;
        ans.row=x.row,ans.col=y.col;
        memset(ans.a,0,sizeof ans.a);
        for(ll i=0;i<x.row;i++)
            for(ll j=0;j<x.col;j++)
                for(ll k=0;k<y.col;k++)
                    ans.a[i][k]=(ans.a[i][k]+x.a[i][j]*y.a[j][k]+mod)%mod;
        return ans;
    }
    Node quick_mul(Node x,ll n)
    {
        Node ans;
        ans.row=x.row,ans.col=x.col;
        memset(ans.a,0,sizeof ans.a);
        for(ll i=0;i<ans.col;i++)ans.a[i][i]=1;
        while(n){
            if(n&1)ans=mul(ans,x);
            x=mul(x,x);
            n>>=1;
        }
        return ans;
    }
    int main()
    {
    
        ios::sync_with_stdio(false);
        cin.tie(0);
     //   cout<<setiosflags(ios::fixed)<<setprecision(2);
        ll t,n,r;
        cin>>t;
        while(t--){
            cin>>n>>r;
            Node A;
            A.row=n,A.col=1;
            for(ll i=0;i<n;i++)cin>>A.a[i][0];
            Node B;
            B.row=n,B.col=n;
            memset(B.a,0,sizeof B.a);
            for(ll i=0;i<n;i++)
            {
                ll k,s;
                cin>>k;
                while(k--){
                    cin>>s;
                    B.a[i][s]=1;
                }
            }
         /*   for(ll i=0;i<n;i++)
            {
                for(ll j=0;j<n;j++)
                    cout<<B.a[i][j]<<" ";
                cout<<endl;
            }*/
            A=mul(quick_mul(B,r),A);
            for(ll i=0;i<n;i++)cout<<A.a[i][0]<<(i==n-1 ? '
    ' : ' ');
        }
        return 0;
    }
    View Code
  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/6867043.html
Copyright © 2011-2022 走看看