G - Great dinner Gym - 102700G

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值