桂林有N个不同的文件,现在他要创建N-1个文件夹(相同)来保存这些文件,每个文件夹内有且只有两个项目,每个项目可以是一个文件或者一个文件夹,问他有多少种不同的存储方式。
第一行一个正整数T,表示数据组数。
接下来T行每行一个正整数N。
共T行,在模19260817的意义下桂林的存储方式总数。
2
3
5
3
105
时间:1s 空间:256M
30%的数据:2≤N≤20;
70%的数据:2≤N≤1000;
100%的数据:T≤100, 2≤N≤10^6
根据排列组合易得:f[1]=1,f[2]=1,f[3]=C(3,1)=3,f[4]=C(3,1)*f[1]*f[3]+C(2,2)*f[2]*f[2]/2(有重复情况,自己手动模拟一下就能发现)=15,f[5]=105...
仔细观察:1=1,3=1*3,15=1*3*5,105=1*3*5*7...发现了吗?
这是一个奇数数列的积(一开始被老师带歪了,Ta告诉我这题不能偷懒,不要找规律,这不是数论题,去建树吧。。。)
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2000010;
const int Mod=19260817;
int t,n;
long long x[N];
int main () {
x[0]=x[1]=1;
for(int i=2; i<=N; i++)
x[i]=x[i-2]*i%Mod;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
printf("%d\n",x[2*n-3]);
}
return 0;
}
原文:https://www.cnblogs.com/mysh/p/11470535.html