https://vjudge.net/contest/392956#problem/G
G - Great dinner Gym - 102700G
UNAL is about to restart classes and the leaders of the algorithms group want to receive all its members with a great dinner in the university campus central dining room.
The group has N members (excluding the leaders) numbered from 1 to N and the leaders want to organize them in a row before entering the dining room, in order to avoid any disorder. However, some students enjoy teasing others. In particular, there are M bullies and M victims, all of these 2×M students are different. Each bully annoys exactly one victim and each victim is being bullied by exactly one bully. To make dinner a great time for everyone, the leaders want to ensure that if student A annoys student B, B must not be ahead of A in the line.
Leaders enjoy math challenges, so they wonder how many ways can they organize all students on a line. Can you help them with that?
Input
The first line contains two integers N (1≤N≤105) and M (0≤2×M≤min(2×103,N)) separated by a space — The number of students, and the number of bullies and victims, respectively.
Each of the following M lines will contain two integers A and B (1≤A,B≤N) separated by a space, which means that student B must not be ahead of A in the line. It is guaranteed that each, A and B, appears at most once in the input.
Output
Output one integer, the number of ways the leaders can organize the students on a line modulo 109+7.
Examples
Input
4 2
2 1
4 3
Output
6
Input
4 1
1 3
Output
12
Note
For the first case, there are only 6 ways to organize the students:
1 2 3 4
1 3 2 4
1 3 4 2
3 1 2 4
3 1 4 2
3 4 1 2
题目意思:就是对n求阶乘得s,对然后求2^m得sum,然后s/sum,再对mod取余
思路:在求s的过程中对s取余,不然超ll,因为2^64次方就超ll,所以得在求s的过程中把sum逐渐除掉
代码如下:
#include <iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<math.h>
#define ll long long
#define inf 0x3f3f3f3f
#define inff 0x3f3f3f3f3f3f3f3f
using namespace std;
const ll mod=1e9+7;
//每一步中取余,和,总的取余对结果没有影响,
//因为2^64就超ll,所以不能把2^m单独拿出来,
//需要在求n的阶乘的时候就给它除掉,
//总的s/总的sum,和,在求s的过程中慢慢把sum给除掉结果一样
//哪怕中间有对s的取余
int main()
{
ll n,m;
cin>>n>>m;
ll s=1;
for(int i=1;i<=m;i++)
{
int q,w;
cin>>q>>w;
}
for(ll i=1;i<=n;i++)
{
if(i%2==0&&m!=0)
{
s=s*(i/2);
m--;
}
else s=s*i;
s=s%mod;
}
cout<<s<<endl;
return 0;
}