运用到了一个公式:(错排公式)
d[i]=(i-1)*(d[i-1]+d[i-2]);
那么问题这样就简单了:
#include <stdio.h> double hdacm(double all, double part) { double i,all_=1.0,part_=1.0,subtract_=1.0; for(i=1; i<=all; i++) all_*=i; for(i=1; i<=part; i++) part_*=i; for(i=1; i<=all-part; i++) subtract_*=i; return all_/part_/subtract_;} int main(){ int n,i,all_,part_; long long jg,sz[25] = {0, 0, 1, 2}; for(i=4; i<21; i++) sz[i]=(i-1)*(sz[i-1]+sz[i-2]); while(~scanf("%d", &n)) { for(i=0; i<n; i++) { scanf("%d%d", &all_, &part_); jg=hdacm(all_, part_); printf("%I64d\n",jg*sz[part_]);}} return 0;}