CodeForces - 316D3 PE Lesson

Posted 蒟蒻JHY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 316D3 PE Lesson相关的知识,希望对你有一定的参考价值。

Discription

Smart Beaver decided to be not only smart, but also a healthy beaver! And so he began to attend physical education classes at school X. In this school, physical education has a very creative teacher. One of his favorite warm-up exercises is throwing balls. Students line up. Each one gets a single ball in the beginning. The balls are numbered from 1 to n (by the demand of the inventory commission).

技术分享图片 Figure 1. The initial position for n?=?5.

After receiving the balls the students perform the warm-up exercise. The exercise takes place in a few throws. For each throw the teacher chooses any two arbitrary different students who will participate in it. The selected students throw their balls to each other. Thus, after each throw the students remain in their positions, and the two balls are swapped.

技术分享图片 Figure 2. The example of a throw.

In this case there was a throw between the students, who were holding the 2-nd and the 4-th balls. Since the warm-up has many exercises, each of them can only continue for little time. Therefore, for each student we know the maximum number of throws he can participate in. For this lessons maximum number of throws will be 1 or 2.

Note that after all phases of the considered exercise any ball can end up with any student. Smart Beaver decided to formalize it and introduced the concept of the "ball order". The ball order is a sequence of n numbers that correspond to the order of balls in the line. The first number will match the number of the ball of the first from the left student in the line, the second number will match the ball of the second student, and so on. For example, in figure 2 the order of the balls was (1, 2, 3, 4, 5), and after the throw it was (1, 4, 3, 2, 5). Smart beaver knows the number of students and for each student he knows the maximum number of throws in which he can participate. And now he is wondering: what is the number of distinct ways of ball orders by the end of the exercise.

Input

The first line contains a single number n — the number of students in the line and the number of balls. The next line contains exactly n space-separated integers. Each number corresponds to a student in the line (the i-th number corresponds to the i-th from the left student in the line) and shows the number of throws he can participate in.

The input limits for scoring 30 points are (subproblem D1):

  • 1?≤?n?≤?10.

The input limits for scoring 70 points are (subproblems D1+D2):

  • 1?≤?n?≤?500.

The input limits for scoring 100 points are (subproblems D1+D2+D3):

  • 1?≤?n?≤?1000000.

Output

The output should contain a single integer — the number of variants of ball orders after the warm up exercise is complete. As the number can be rather large, print it modulo 1000000007 (109?+?7).

Examples

Input
5
1 2 2 1 2
Output
120
Input
8
1 2 2 1 2 1 1 2
Output
16800


比较基础的计数题。
首先称一个只能换一次球的人为 懒人,那么我们可以发现一个排列合法 当且仅当 -> 这个排列的置换中,每个环的懒人数都要<=2
考虑置换中的一个有x个元素的环,我们总能构造一种交换方式使得至多有两个元素只被交换一次。

然后dp + 组合就行啦、

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int ha=1e9+7,maxn=1000005;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
int n,m,ans=1,F[maxn];
char ch;

inline void dp(){
	F[0]=F[1]=1;
	for(int i=2;i<=m;i++) F[i]=add(F[i-1],F[i-2]*(ll)(i-1)%ha);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(ch=getchar();ch!=‘1‘&&ch!=‘2‘;ch=getchar());
		if(ch==‘1‘) m++;
	}
	
	dp();
	
	for(int i=m+1;i<=n;i++) ans=ans*(ll)i%ha;
	ans=ans*(ll)F[m]%ha;
	printf("%d\n",ans);
	return 0;
}

  

 











以上是关于CodeForces - 316D3 PE Lesson的主要内容,如果未能解决你的问题,请参考以下文章

哈希专题--Codeforces

codeforces 983B XOR-pyramid

Codeforces 805A/B/C

CodeForces 444C 分块

Codeforces Round #394 (Div. 2)

CodeForces - 86D 莫队算法