题意

n个数字,要求至少k个数字位置不变,其余进行错排的方案数

分析

错排公式:

D(n)=(n-1)[D(n-2)+D(n-1)]

 如果n个数字,i个数字位置不变,其余进行错排的的方案数是C(n,i)*D[n-i]

那么题目的答案显然就是从k枚举到n,然后把所有的方案数加起来,这样显然是正确的,但是等等!这样会超时(而且也会MLE)!因为k很    小而n比较大!

所以我们可以把问题反过来。枚举从0到k-1,把方案数加起来,再用n的全排列减去这个方案数的和,这样就可以在时间范围内解决啦

等等,WA掉了!一脸懵逼的开始试数据。当试了一个n=13,k=1的时候发现是个负的!也就是这个错排的方案数大于了全排列的方案数,所以相减变成了负的!可是这怎么可能!

这是可能的,因为,我们取模了!所以此时错排方案数还没有超过MOD值但是全排列超过了,所以反而全排列要小。为了解决这个我们只要在相减的时候先加上一个MOD再相减就可以了~

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream> using namespace std;
const int maxn=+;
const int MOD=;
int T,k;
long long n,ans;
long long c[maxn][],D[maxn],A[maxn];
void init(){
D[]=; D[]=;D[]=;
for(int i=;i<=;i++){
D[i]=((i-)*(D[i-]+D[i-])%MOD)%MOD;
}
c[][]=,c[][]=;
for(int i=;i<=;i++){
c[i][]=;
for(int j=;j<=min(i,);j++){
c[i][j]=(c[i-][j-]+c[i-][j])%MOD;
}
}
A[]=;
for(int i=;i<=;i++){
A[i]=(A[i-]%MOD*i%MOD)%MOD;
}
return ;
}
int main(){
init();
scanf("%d",&T);
for(int t=;t<=T;t++){
ans=;
scanf("%lld%d",&n,&k); //cout<<D[n]<<endl;
//cout<<A[n]<<endl;
for(int i=;i<k;i++){
int res=(c[n][i]%MOD*D[n-i]%MOD)%MOD;
ans=(ans+res)%MOD;
}
ans=(A[n]-ans+MOD)%MOD;
/* for(int i=k;i<=n;i++){
int res=(c[n][i]%MOD*D[n-i]%MOD)%MOD;
ans=(ans+res)%MOD;
}*/
printf("%lld\n",ans);
}
return ;
}
/*
100
5 1
76
7 4
92
8 5
141
13 1
-63772160
52 10
273085312
*/

FZU2282 Wand的更多相关文章

  1. wand(weak and)算法基本思路

    一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应该,主要是adsense场景,需要搜索一个页面内容的 ...

  2. Wand FZU - 2282 全错位重排

    N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...

  3. foj Problem 2282 Wand

     Problem 2282 Wand Accept: 432    Submit: 1537Time Limit: 1000 mSec    Memory Limit : 262144 KB Prob ...

  4. K - Wand(组合数+错排公式)

    N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...

  5. Python 资源大全中文版

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  6. SAP 出库单新版

    *&---------------------------------------------------------------------* *& Report  ZSDR045 ...

  7. ABAP 出库单打印 产品 A搭A A搭B显示方式

    *&---------------------------------------------------------------------* *& Report   *& ...

  8. hdu-1179-二分图最大匹配

    Ollivanders: Makers of Fine Wands since 382 BC. Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. C++之路进阶——HDU1880(魔咒词典)

    ---恢复内容开始--- New~ 欢迎参加2016多校联合训练的同学们~ 魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 3 ...

随机推荐

  1. WEKA中的数据预处理

    数据预处理包括数据的缺失值处理.标准化.规范化和离散化处理. 数据的缺失值处理:weka.filters.unsupervised.attribute.ReplaceMissingValues. 对于 ...

  2. tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)

    /************************************************************************************ * tslib: Selec ...

  3. Java进阶知识点4:不可变对象与并发 - 从String说起

    一.String的不可变特性 熟悉Java的朋友都知道,Java中的String有一个很特别的特性,就是你会发现无论你调用String的什么方法,均无法修改this对象的状态.当确实需要修改Strin ...

  4. [QT][问题]关于QT语言家使用失败的原因之一

    按照标准的qt使用教程 ( http://www.qter.org/forum.php?mod=viewthread&tid=781 ) 实践了下,发现除去主界面外,点开的窗口多语言没有问题. ...

  5. 重温CLR(三)类型基础

    所有类型都从System.Object派生 “运行时”要求每个类型最终都要从System.Object类型派生.也就是说,一下两个类型的定义完全一致. //隐式派生自Object class Empl ...

  6. matlab算法转为c语言注意事项

    matlab算法转为c语言后,影响c语言效率的关键在于multiword的产生,基于此会有multiword加减法和乘除法,极大消耗资源,减少甚至消除multiword很重要,需注意的是:算法中尽量减 ...

  7. android 中管理短信

    为了看代码方便,一边在网上google资料,一边看Android java 源代码. 偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mm ...

  8. flask 之 mongodb

    查看mongod 是否启动,启动了会显示进程ID和程序名 pgrep mongod -l 查找mongod的位置whereis mongod 或locate mongod 启动mongodmongod ...

  9. (转)Oracle游标使用全解

    -- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...

  10. Scanner 的练习 。。。。依然不懂用法。。。苦恼

    package com.b; import java.util.Random; import java.util.Scanner; public class Core { public static ...