⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pendant.cpp

📁 第四届百度杯编程大赛final解题报告+标程
💻 CPP
字号:
/**********************************************************************
Author: Sherlock
Created Time:  2009-03-24 19:51:46
File Name: necklace.cpp
Description: 
**********************************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>

#define int64 long long

const   int     mod =   1234567891;

int     n, m;
int     a[31][31], b[31][31], c[31][31], d[31][31], z[31][31];

void        mul(int x[31][31], int y[31][31])
{
    for (int i = 0; i <= m; i ++)
        for (int j = 0; j <= m; j ++)
        {
            z[i][j] = 0;
            for (int k = 0; k <= m; k ++)
                z[i][j] = ((int64) z[i][j] + ((int64) x[i][k] * y[k][j]) % mod) % mod;
        }
    for (int i = 0; i <= m; i ++)
        for (int j = 0; j <= m; j ++)
            x[i][j] = z[i][j];
}

void        make(int p)
{
    if (p == 0)
        return ;
    make(p / 2);
    for (int i = 0; i <= m; i ++)
        for (int j = 0; j <= m; j ++)
            d[i][j] = b[i][j];
    for (int i = 0; i <= m; i ++)
        d[i][i] = (d[i][i] + 1) % mod;
    mul(c, d);
    mul(b, b);
    if (p % 2 == 1)
    {
        mul(b, a);
        for (int i = 0; i <= m; i ++)
            for (int j = 0; j <= m; j ++)
                c[i][j] = ((int64) c[i][j] + b[i][j]) % mod;
    }
}

void        solve()        
{ 
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    for (int i = 0; i <= m; i ++)
        b[i][i] = 1;
    for (int i = 1; i <= m; i ++)
    {
        a[i - 1][i] = m - i + 1;
        a[i][i] = i;
    }
    make(n);
    printf("%d\n", c[0][m]);
} 

int         main()
{
    int test_num;
    scanf("%d", &test_num);
    while (test_num > 0)
    {
        test_num --;
        scanf("%d%d", &n, &m);
        solve();
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -