1. 程式人生 > >D. New Year and the Permutation Concatenation(打表找規律)

D. New Year and the Permutation Concatenation(打表找規律)

http://codeforces.com/contest/1091/problem/D

D. New Year and the Permutation Concatenation

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Let n

be an integer. Consider all permutations on integers 1 to n in lexicographic order, and concatenate them into one big sequence p. For example, if n=3, then p=[1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1]. The length of this sequence will be n⋅n!

.

Let 1≤i≤j≤n⋅n!

be a pair of indices. We call the sequence (pi,pi+1,…,pj−1,pj) a subarray of p. Its length is defined as the number of its elements, i.e., j−i+1. Its sum is the sum of all its elements, i.e., ∑jk=ipk

.

You are given n

. Find the number of subarrays of p of length n having sum n(n+1)2. Since this number may be large, output it modulo 998244353

(a prime number).

Input

The only line contains one integer n

 (1≤n≤106

), as described in the problem statement.

Output

Output a single integer — the number of subarrays of length n

having sum n(n+1)2, modulo 998244353

.

Examples

Input

Copy

3

Output

Copy

9

Input

Copy

4

Output

Copy

56

Input

Copy

10

Output

Copy

30052700

Note

In the first sample, there are 16

subarrays of length 3

. In order of appearance, they are:

[1,2,3]

, [2,3,1], [3,1,3], [1,3,2], [3,2,2], [2,2,1], [2,1,3], [1,3,2], [3,2,3], [2,3,1], [3,1,3], [1,3,1], [3,1,2], [1,2,3], [2,3,2], [3,2,1]

.

Their sums are 6

, 6, 7, 6, 7, 5, 6, 6, 8, 6, 7, 5, 6, 6, 7, 6. As n(n+1)2=6, the answer is 9

解題思路:

比賽的時候一頭霧水。賽後打了個表也沒發現什麼規律。還是觀察力少了些。

打表可發現:

3——————9

4——————56

5——————395

6——————3084

(因為連起來的排列組合的sum一定是n*(n-1)/2,所以)

3——————9=3!+3=3!+1*3

4——————56=4!+32=4!+4*8

5——————395=5!+275=5!+5*55

6——————3084=6!+2364=6!+6*394

emmmmmmmmmm....這樣就推出來了。也是很有趣。

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=998244353;
const int maxn=1000000+100;
LL P[maxn];
int main()
{
    LL n;
    while(scanf("%lld",&n)!=EOF){
        LL fac;
        P[1]=1;
        P[2]=2;
        P[3]=9;
        fac=6;
        for(int i=4;i<=n;i++){
            fac=fac*i%mod;
            P[i]=(((P[i-1]-1)%mod*i)%mod+fac)%mod;
        }
        printf("%lld\n",P[n]);
    }
}

打表程式碼:

#include<bits/stdc++.h>
using namespace std;
int b[1000000];
int bb[1000000];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            b[i]=i;
            bb[i]=i;
        }
        int index=n;
        while(next_permutation(b+1,b+n+1)){
            for(int i=1;i<=n;i++){
                index++;
                bb[index]=b[i];
            }
        }
        /*cout<<"index:"<<index<<endl;
        for(int i=1;i<=index;i++){
            cout<<bb[i]<<"  * ";
        }*/

        int countt=0;
        for(int i=1;i<=index-n+1;i++){
            int sum=0;
            for(int j=i;j<i+n;j++){
                sum+=bb[j];
            }
            ///cout<<"sum:"<<sum<<endl;
            if(sum==n*(n+1)/2){
                countt++;
            }
        }
        cout<<"countt:"<<countt<<endl;
         cout<<endl;
    }
}