FZU Problem 1692 Key problem(循环矩阵)
循环矩阵,这里有解说:http://wenku.baidu.com/link?
url=zcJ-sxrj0QDqzz8xCnHTnB7gxjoNRyOZzS4_4ZA22c8Bs9inYn6vVkqTVr_w-riLa8oRnYA9SRcCZ9f4UciCUNGeNAG4dCGclYRPS18YLGa
推出第一层以下依据性质就能够得到。
Problem 1692 Key problem
Accept: 144    Submit: 663
Time Limit: 1000 mSec    Memory Limit : 32768 KB
 Problem Description
 Problem Description
 Input
 Input
 Output
 Output
Each case separated by a space. See sample.
 Sample Input
 Sample Input
1 3 2 3 4 10000 1 2 3
 Sample Output
 Sample Output
120 133 131
 Source
 Source
FOJ月赛-2009年3月--- Coral#include <set>
#include <map>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define pi acos(-1.0)
#define LL __int64
using namespace std;
const int maxn = 110;
LL a[maxn], b[maxn], f[maxn];
LL mod, n;
void mul(LL a[], LL b[])
{
    LL c[maxn];
    memset(c, 0, sizeof(c));
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++) c[i] = (a[j]*b[(i-j+n)%n]+c[i])%mod;
    memcpy(a, c, sizeof(c));
}
void pow_mod(LL a[], LL b)
{
    LL c[maxn];
    memset(c, 0, sizeof(c));
    c[0] = 1LL;
    while(b)
    {
        if(b&1) mul(c, a);
        mul(a, a);
        b >>= 1;
    }
    memcpy(a, c, sizeof(c));
}
int main()
{
    int T;
    cin>>T;
    LL m, l, r;
    while(T--)
    {
        cin>>n>>m>>l>>r>>mod;
        for(int i = 0;i < n;i++)  cin>>a[i];
        memset(f, 0, sizeof(f));
        f[0] = 1; f[1] = r; f[n-1]=l;
        pow_mod(f, m);
        LL ans[maxn];
        for(int i = 0; i < n; i++)
        {
            ans[i] = 0;
            for(int j = 0;j < n;j++)
                ans[i] = (ans[i]+a[j]*f[(i-j+n)%n])%mod;
        }
        cout<<ans[0];
        for(int i = 1; i < n; i++) cout<<" "<<ans[i];
        cout<<endl;
    }
    return 0;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号