zoukankan      html  css  js  c++  java
  • 骨牌覆盖问题·二

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?
    所以我们的题目是:对于3xN的棋盘,使用1x2的骨牌去覆盖一共有多少种不同的覆盖方法呢?
    首先我们可以肯定,奇数长度一定是没有办法覆盖的;对于偶数长度,比如2,4,我们有下面几种覆盖方式:

    输入

    第1行:1个整数N。表示棋盘长度。1≤N≤100,000,000

    输出

    第1行:1个整数,表示覆盖方案数 MOD 12357

    样例输入
    62247088
    样例输出
    4037
    提示:

    首先当n为奇数时显然无解的,输出0;

    当n为偶数时,从小看:

    n=2时有3种。每增加两列,可以看成一下情况:

    1.这两列与之前不相连,单独摆放,有3种,即3*f(n-2);

    2.这两列与之前两列中间相连,也就是说中线有横着摆放的(n-2和n-1列),有这种,还可以把底下两个横着的放到顶上,所以有两种情况,把后4列看作整体,即2*f(n-4);

    而还有可能n-3与n-4列之间相连,即把后6列看作整体,也有两种,即2*f(n-6),递推之。

    递推的终点是f(0)=1;f(2)=3;

    #include <iostream>
    using namespace std;
    
    typedef unsigned long long ll;
    const ll MOD = 12357;
    
    ll N;
    ll a[5];
    
    void solve() {
        a[0] = 0;
        a[1] = 2;
        a[2] = 3;
        for (int i = 3; i <= N; ++i) {
            cout<<(i&1)<<endl;
            if (i&1) {                                                        //i为奇数
                a[i%5] = (2*a[(i-1+5)%5] + a[(i-2+5)%5]) % MOD;
            } else {                                                            //i为偶数
                a[i%5] = (3*a[(i-2+5)%5] + a[(i-3+5)%5]) % MOD;
            }
        }
        cout << a[N%5] << endl;
    }
    
    int main() {
        while (cin >> N) {
            if (N & 1) {
                cout << "0" << endl;
            } else {
                solve();
            }
        }
        return 0;
    }
    

    注:代码转

    态度决定高度,细节决定成败,
  • 相关阅读:
    MVC设计模式和三层架构
    Servlet使用反射机制
    JSP的工作原理
    Servlet相关的几种乱码
    Word发送至博客园
    使用为知笔记上传到博客园
    idea乱码问题
    Servlet快速入门及运行流程
    【转】SQL注入及mybatis中#{}和${}的区别
    我的这个时代与你们
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/4438747.html
Copyright © 2011-2022 走看看