题意:
给你n个人的位置,每个人能往后跳一格或两格到无人的位置,跳到0位置,这个人消失,n个人消失组成一个排列,问有多少种排列。
思路:
额,搞了一整场这个A...代码也巨挫了。
处理成1,3,5,7,9.....的位置情况,当出现连续的时候,比如1,3,5,7,8的话那么后面的数怎么跳都不会在前面这些数之前跳出去,bingo!
所以当前就可以说明这几个就可以在现在跳出去,比如1,3,5,7,8这5个数,第一次跳出去的数有5种情况,然而一个跳出去以后,接下来一个位置是7这个位置。
代码num表示当前出去的数量。
code:
给你n个人的位置,每个人能往后跳一格或两格到无人的位置,跳到0位置,这个人消失,n个人消失组成一个排列,问有多少种排列。
思路:
额,搞了一整场这个A...代码也巨挫了。
处理成1,3,5,7,9.....的位置情况,当出现连续的时候,比如1,3,5,7,8的话那么后面的数怎么跳都不会在前面这些数之前跳出去,bingo!
所以当前就可以说明这几个就可以在现在跳出去,比如1,3,5,7,8这5个数,第一次跳出去的数有5种情况,然而一个跳出去以后,接下来一个位置是7这个位置。
代码num表示当前出去的数量。
code:
#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL mod=1e9+7; const int N=1e5+10; LL n; int a[N]; LL f[N]; void init() { f[0]=1; for(LL i=1;i<=100000;i++) f[i]=f[i-1]*i%mod; } int main() { init(); scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); LL ans=1; LL b=1; LL num=0; for(LL i=2;i<=n;i++) { if(b+2<=a[i]) b=b+2; else { ans=ans*(i-num)%mod; num++; } } ans=ans*f[n-num]%mod; printf("%lld ",ans); return 0; }