问题描述
小R正在研究一种特殊的排列,称为“好排列”。一个排列被称为“好排列”,当且仅当其中所有相邻的两个数的乘积均为偶数。现在给定一个正整数 nn,小R想知道,长度为 nn 的好排列共有多少种。由于结果可能非常大,你需要将结果对 109+7109+7 取模后输出。
思路
对于任何自然数n,如果n为奇数,则在1,2...n中奇数比偶数多一位,则满足要求的排列只有可能是“奇偶奇偶...奇偶奇奇偶“的模式
如果n为偶数,可以发现好排列中最多有一个连续的偶数。 当不存在两个连续的偶数时,有”奇偶奇偶“和”偶奇偶奇“两种可能 当存在两个连续的偶数时,有(n/2)(n/2-1)种选择这两个整数的方式,之后可以把这两个整数看做是一个整体,其余部分构成当n为n-1时的答案
代码示例
#include <iostream>
long m = 1e9+7;
long add(long a, long b) {
return(a+b)%m;
}
long time(long a, long b) {
return a*b%m;
}
long fac(long a) {
long res = 1;
while(a) {
res = time(res,a);
a--;
}
return res;
}
int solution(int n) {
int odd_num = (n+1)/2;
int even_num = n/2;
long res = time(fac(odd_num),fac(even_num));
if(odd_num==even_num) {
res = time(res,2);
res = add(res, time(time(even_num,even_num-1),solution(n-1)));
}
return res;
}
代码示例
#include long m = 1e9+7; long add(long a, long b) { return(a+b)%m; } long time(long a, long b) { return ab%m; } long fac(long a) { long res = 1; while(a) { res = time(res,a); a--; } return res; } int solution(int n) { int odd_num = (n+1)/2; int even_num = n/2; long res = time(fac(odd_num),fac(even_num)); if(odd_num==even_num) { res = time(res,2); res = add(res, time(time(even_num,even_num-1),solution(n-1))); } return res; } #include long m = 1e9+7; long add(long a, long b) { return(a+b)%m; } long time(long a, long b) { return ab%m; } long fac(long a) { long res = 1; while(a) { res = time(res,a); a--; } return res; } int solution(int n) { int odd_num = (n+1)/2; int even_num = n/2; long res = time(fac(odd_num),fac(even_num)); if(odd_num==even_num) { res = time(res,2); res = add(res, time(time(even_num,even_num-1),solution(n-1))); } return res; } #include long m = 1e9+7; long add(long a, long b) { return(a+b)%m; } long time(long a, long b) { return ab%m; } long fac(long a) { long res = 1; while(a) { res = time(res,a); a--; } return res; } int solution(int n) { int odd_num = (n+1)/2; int even_num = n/2; long res = time(fac(odd_num),fac(even_num)); if(odd_num==even_num) { res = time(res,2); res = add(res, time(time(even_num,even_num-1),solution(n-1))); } return res; } #include long m = 1e9+7; long add(long a, long b) { return(a+b)%m; } long time(long a, long b) { return ab%m; } long fac(long a) { long res = 1; while(a) { res = time(res,a); a--; } return res; } int solution(int n) { int odd_num = (n+1)/2; int even_num = n/2; long res = time(fac(odd_num),fac(even_num)); if(odd_num==even_num) { res = time(res,2); res = add(res, time(time(even_num,even_num-1),solution(n-1))); } return res; }