Cyclic
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 193 Accepted Submission(s): 125
Problem Description
Count the number of cyclic permutations of length n with no continuous subsequence [i, i + 1 mod n].
Output the answer modulo 998244353.
Output the answer modulo 998244353.
Input
The first line of the input contains an integer T , denoting the number of test cases.
In each test case, there is a single integer n in one line, denoting the length of cyclic permutations.
1 ≤ T ≤ 20, 1 ≤ n ≤ 100000
In each test case, there is a single integer n in one line, denoting the length of cyclic permutations.
1 ≤ T ≤ 20, 1 ≤ n ≤ 100000
Output
For each test case, output one line contains a single integer, denoting the answer modulo 998244353.
Sample Input
3
4
5
6
Sample Output
1
8
36
题意:求满足一个方向的(a[i]+1)%n!=a[i+1]循环数列的n个数字组成的数列的可能性
分析:首先按照题目的意思做一个全排列列出前面几项的可能数
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e5+10; const ll mod = 998244353; const double pi = acos(-1.0); const double eps = 1e-8; ll a[maxn]; int main() { ios::sync_with_stdio(0); ll T, n; scanf("%lld",&T); while( T -- ) { scanf("%lld",&n); for( ll i = 0; i < n; i ++ ) { a[i] = i+1; } ll cnt = 0; while(next_permutation(a,a+n)) { bool flag = true; for( ll i = 0; i < n-1; i ++ ) { ll t; if( (a[i]+1)%n == 0 ) { t = a[i]+1; } else { t = (a[i]+1)%n; } if( t == a[i+1] ) { flag = false; break; } } ll t; if( (a[n-1]+1)%n == 0 ) { t = a[n-1]+1; } else { t = (a[n-1]+1)%n; } if( t == a[0] ) { flag = false; } if(flag) { cnt ++; /*for( ll i = 0; i < n; i ++ ) { cout << a[i] << " "; } cout << endl;*/ } } printf("%lld ",cnt/n); } return 0; }
接着找规律
AC代码:
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e5+10; const ll mod = 998244353; const double pi = acos(-1.0); const double eps = 1e-8; ll a[maxn]; int main() { ios::sync_with_stdio(0); ll T, n; a[1] = 0, a[2] = 0, a[3] = 0, a[4] = 1, a[5] = 8, a[6] = 36; for( ll i = 7; i <= maxn-10; i ++ ) { a[i] = ((i-3)*a[i-1]%mod+(i-2)*(2*a[i-2]+a[i-3])%mod)%mod; } scanf("%lld",&T); while( T -- ) { scanf("%lld",&n); printf("%lld ",a[n]); } return 0; }