zoukankan      html  css  js  c++  java
  • 放课后的约定

    【题目描述】

    “十年。十年前。天空的蔚蓝,云彩的舒软。我,怎么会认识你。洁白的,洁白的,十年前。我无法忘却。终究是小时候的约定。记忆被困在冻土里,有时我不认识那天的我。难道一切,都锁在心里面了吗?”

    学校草坪为一块N×M的地图,一条从左上角(1,1)、千棘从右下角(n,m)开始寻找。

    每个时刻,一条会选择一个他自己没有找过的某块草坪开始找,千棘也这么做,但是,同一时刻,一条和千棘不能在同一个格子里,不然他们会发生口角。

    现询问有多少合法的搜寻方案。

    【输入描述】

    第一行输入两个整数N、M,表示草坪的长和宽。

    【输出描述】

    一行输出一个正整数Ans,表示方案数 mod 23333的值。

    【输入样例】

    2 2

    【输出样例】

    18

    【数据范围及提示】

    样例解释:

    一条:(1,1)-(1,2)-(2,1)-(2,2)  千棘:(2,2)-(1,1)-(1,2)-(2,1)

    一条:(1,1)-(1,2)-(2,1)-(2,2)  千棘:(2,2)-(2,1)-(1,1)-(1,2)

    一条:(1,1)-(1,2)-(2,1)-(2,2)  千棘:(2,2)-(2,1)-(1,2)-(1,1)

    一条:(1,1)-(1,2)-(2,2)-(2,1)  千棘:(2,2)-(1,1)-(2,1)-(1,2)

    一条:(1,1)-(1,2)-(2,2)-(2,1)  千棘:(2,2)-(2,1)-(1,1)-(1,2)

    一条:(1,1)-(1,2)-(2,2)-(2,1)  千棘:(2,2)-(2,1)-(1,2)-(1,1)

    一条:(1,1)-(2,1)-(1,2)-(2,2)  千棘:(2,2)-(1,1)-(2,1)-(1,2)

    一条:(1,1)-(2,1)-(1,2)-(2,2)  千棘:(2,2)-(1,2)-(1,1)-(2,1)

    一条:(1,1)-(2,1)-(1,2)-(2,2)  千棘:(2,2)-(1,2)-(2,1)-(1,1)

    一条:(1,1)-(2,1)-(2,2)-(1,2)  千棘:(2,2)-(1,1)-(1,2)-(2,1)

    一条:(1,1)-(2,1)-(2,2)-(1,2)  千棘:(2,2)-(1,2)-(1,1)-(2,1)

    一条:(1,1)-(2,1)-(2,2)-(1,2)  千棘:(2,2)-(1,2)-(2,1)-(1,1)

    一条:(1,1)-(2,2)-(1,2)-(2,1)  千棘:(2,2)-(1,1)-(2,1)-(1,2)

    一条:(1,1)-(2,2)-(1,2)-(2,1)  千棘:(2,2)-(1,2)-(2,1)-(1,1)

    一条:(1,1)-(2,2)-(1,2)-(2,1)  千棘:(2,2)-(2,1)-(1,1)-(1,2)

    一条:(1,1)-(2,2)-(2,1)-(1,2)  千棘:(2,2)-(1,1)-(1,2)-(2,1)

    一条:(1,1)-(2,2)-(2,1)-(1,2)  千棘:(2,2)-(1,2)-(1,1)-(2,1)

    一条:(1,1)-(2,2)-(2,1)-(1,2)  千棘:(2,2)-(2,1)-(1,2)-(1,1)

    共计18种方案。

    对于30%的数据,n ≤ 2011,m ≤ 1000;

    对于100%的数据,1 ≤ n ≤ 20114820163637,1 ≤ m ≤ 201205201610。

    源代码:
    
    #include<cstdio>
    #define INF 23333
    #define LL long long
    LL n,m,Sum=1,i[24000];
    int main()
    {
        scanf("%I64d%I64d",&n,&m);
        if (n>INF||m>INF||n*m>INF||n*m==1) //一模没。
        {
            printf("0");
            return 0;
        }
        if (m*n==2) //都是特判。
        {
            printf("1");
            return 0;
        }
        i[2]=1;
        for (LL a=1;a<=n*m-2;a++)
          Sum=Sum*a%INF;
        for (LL a=3;a<=n*m;a++)
          i[a]=(i[a-1]+i[a-2])%INF*(a-1)%INF;
        printf("%I64d",Sum*i[n*m]%INF);
        return 0;
    }
    
    /*
        排列组合还是弱。
        n*m个格子可以看做S(n*m)个信封(⑨要写信)。
        若第1个格子不作要求,则第1个格子有n*(n-1)种可能,那么一条的方案数就是错排公式:
            (S-1)*(f[S-1]+f[S-2])
        同时,千棘(其实我是小野寺党)的方案数为全排列:
            S!
        若第1个格子为定值,则最终结果为:
            (S-2)!*f[S]
        还是要冷静仔细地分析问题。
    */
  • 相关阅读:
    CSS学习笔记07 盒子模型
    [Android]AndFix使用说明
    [Android]自定义控件LoadMoreRecyclerView
    [算法]Plus One
    [Android]android Service后台防杀
    [Android]android studio预览视图时报错
    [算法]删除无序单链表中值重复出现的节点
    [算法] 将单链表的每K个节点之间逆序
    [Android]热修复框架AndFix测试说明
    [算法]单链表的选择排序
  • 原文地址:https://www.cnblogs.com/Ackermann/p/6055571.html
Copyright © 2011-2022 走看看