2017.1.20【初中部 GDKOI】模拟赛B组 电影院(cinema) 题解

原题:

http://172.16.0.132/senior/#contest/show/1911/2

题目描述:

成对成对的人生赢家要去看电影了啦!身为FFF团的骨干,你当然不能坐视不管。但为首的人生赢家小W实在太神辣,你只敢搞一些小动作。
土豪小W包下了电影院的一个包厢,其中有 n 排 m 列座位;相应的,看电影的人共有 nm/2 对。你无力阻止一对人生赢家坐在同一排(这是他们的底线)(m是一个偶数),但你可以想办法让每一对情侣都不相邻。求方案数 mod P 的值。

输入:

三个数 n, m , p

输出:

每一对情侣在同一排但不相邻的安排方案数 mod P 的值。

样例输入:

2 4 10007

样例输出:

384

样例解释:

假设四对人生赢家分别是S-T,U-V,W-X,Y-Z
┏ ━ ━ ━ ┓
┃ SUTV ┃
┃ WYXZ┃ 是一种基本方案
┗ ━ ━ ━ ┛
将四对人生赢家任意互换,再将大小写字母任意互换,产生 4!*2^4=384 种合法方案。

分析:

通过归纳,我们可以得知:这里写图片描述其中这里写图片描述

实现:

var 
    i:longint;
    n,m,p,ans:int64;
    f:array[0..5000001]of int64;
function power(x,y:int64):int64;
var
    t:int64;
begin
    if y=1 then exit(x);
    t:=power(x,y div 2); t:=t*t mod p;
    if y mod 2=0 then exit(t)else exit(t*x mod p);
end;
begin
    readln(n,m,p);
    m:=m div 2; 
    if (n*m>=p) then 
    begin
        writeln(0);
        halt;
    end;
    f[0]:=1; f[1]:=0;
    for i:=2 to m do f[i]:=((2*i-1)*f[i-1] mod p+f[i-2]) mod p;
    ans:=power(f[m],n);
    for i:=1 to n*m do ans:=ans*i*2 mod p;
    writeln(ans);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值