poj3150

一点也不懂,看也看不懂。。

http://www.cppblog.com/varg-vikernes/archive/2011/02/08/139804.html

#include <iostream>

using namespace std;

int n, m, d, k;

void mul(long long a [], long long b [])
{
    int i, j;
    long long c[501];
    for (i = 0; i < n; ++i)for (c[i] = j = 0; j < n; ++j)c[i] += a[j] * b[i >= j ? (i - j) : (n + i - j)];
    for (i = 0; i < n; b[i] = c[i++] % m);
}

long long init[505], tmp[505];

int main()
{
    int i, j;
    while (~scanf_s("%d%d%d%d", &n, &m, &d, &k))
    {
        memset(init, 0sizeof(init));
        memset(tmp, 0sizeof(tmp));
        for (i = 0; i < n; ++i)scanf_s("%I64d", &init[i]);
        for (tmp[0] = i = 1; i <= d; ++i)tmp[i] = tmp[n - i] = 1;
        while (k)
        {
            if (k & 1)mul(tmp, init);
            mul(tmp, tmp);
            k >>= 1;
        }
        for (i = 0; i < n; ++i)if (i)printf(" %I64d", init[i]); else printf("%I64d", init[i]);
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(ACM题解报告)