摆书【错排公式】

B.摆书

题目链接(点击)
Description
    Quasrain 和 FZ 是好朋友。某天老师交给他们两组相同的书,每组书都是 n 本且不重复。他们需要把这两组书排列到一行 n 个书架上,每个书架上放两本书,且同一个人不能在同一个书架上放两本书。现在他们想知道,每个书架上的两本书都不一样的方案数。这n个书架互相等价,不区分顺序
Input
    多组数据,读入到文件结尾。
    对于每一组数据,包含一个数 n,意义如题面所示
Output
    对于每组数据,输出方案数,对 998244353 取模后的值
Sample Input
    2
    3
    4
Sample Output
    1
    2
    9
Hint
    2<=N<=10^5

    输入数据不超过 100 行

    对于第二组样例:摆放方式有

    甲取{1,2,3},乙取{2,3,1}

    甲取{1,2,3},乙取{3,1,2}

    甲取{1,2,3},乙取{2,3,1}的方案与甲取{2,1,3},乙取{3,2,1}的方案等价

思路:

   上午比赛做这个题耗了好长时间最后还是没做出来 确实是没思路 漫无目的的找规律

    看了题解 确实直接推不好推 看了几个博客 下面这个讲解的还很好:

                   https://blog.csdn.net/bengshakalakaka/article/details/83420150

     现在想想这个题确实是很形象的在描述 错排:相同课本不可以放在一起

      1 2 9 44  265 ……

AC代码:

#include<stdio.h>
typedef long long LL;
const int MAX=1e5;
const int mod=998244353;
int main()
{
    LL a[MAX+5],n;
    a[2]=1,a[3]=2;
    for(LL i=4;i<=MAX;i++){
        a[i]=(((i-1)%mod)*((a[i-1]+a[i-2])%mod))%mod;
    }
    while(scanf("%lld",&n)){
        printf("%lld\n",a[n]%mod);
    }
    return 0;
}

 

posted @ 2019-03-31 20:36  XJHui  阅读(112)  评论(0编辑  收藏  举报