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

    题目链接:https://vjudge.net/problem/UVALive-3704

    具体思路:用一维数组表示二维数组。

    AC代码:

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<stdio.h>
    #include<queue>
    #include<stack>
    using namespace std;
    # define inf 0x3f3f3f3f
    # define maxn 500+100
    # define ll long long
    ll n,m,d,k;
    ll ans[maxn];
    ll fir[maxn];
    struct Matrix
    {
        ll a[maxn];
    } t1,t2;
    Matrix mul(Matrix w1, Matrix w2)
    {
        Matrix temp;
        for(ll j=1; j<=n; j++)
        {
            temp.a[j]=0;
            for(ll k=1; k<=n; k++)
            {
                temp.a[j]=(temp.a[j]+w1.a[k]*w2.a[(j-k+n)%n+1])%m;
            }
        }
        return temp;
    }
    Matrix quickpow() // t1 - > n*n , t2 - > 1*n
    {
        Matrix tt=t2;
        k--;
        while(k)
        {
            if(k&1)
            {
                tt=mul(tt,t1);
            }
            t1=mul(t1,t1);
            k=k>>1;
        }
        return tt;
    }
    int main()
    {
        while(~scanf("%lld%lld%lld%lld",&n,&m,&d,&k))
        {
            for(ll i=1; i<=n; i++)
            {
                scanf("%lld",&fir[i]);
            }
            for(ll i=1; i<=n; i++)
            {
                t1.a[i]=0;
            }
            for(ll i=1; i<=d+1; i++)
            {
                t1.a[i]=1;
            }
            for(ll i=1; i<=d; i++)
            {
                t1.a[n-i+1]=1;
            }
            t2=t1;
            Matrix w=quickpow();
            memset(ans,0,sizeof(ans));
            for(ll i=1; i<=n; i++)
            {
                for(ll j=1; j<=n; j++)
                {
                    ans[i]=(ans[i]+w.a[(i-j+n)%n+1]*fir[j])%m;
                }
            }
            for(ll i=1; i<=n; i++)
            {
    
                printf("%lld",ans[i]);
                if(i!=n)printf(" ");
            }
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    Project Euler 389 Platonic Dice (概率)
    单纯形(相关题目)
    关于C++中的内存泄露
    莫比乌斯反演与积性函数求和筛法中的一些细节
    清华集训2015-Day 2
    bzoj3456-城市规划
    多项式运算的一些技术
    bzoj2302-Problem c
    bzoj4300-绝世好题
    bzoj4726-Sabota?
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262834.html
Copyright © 2011-2022 走看看