• 4827 妹子[快速乘法]


    4827 妹子

     

     时间限制: 1 s
     空间限制: 64000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 Description

    特大喜讯:信奥班来妹纸了!

    为了给妹纸介绍自己,信奥班的才子们专门准备了一场自我介绍会,出席的就太多了,有

    a,b,c,d......全是爷们儿就不一一介绍了。

    a 听见有妹纸了,就自告奋勇当主持人,当然也就是第一个出场的,然后我们自

    己安排出场顺序,为了不给妹纸制造紧张的气氛,我们决定把妹纸们穿插在我们之间进行

    自我介绍。但是其中有一个妹纸是很爷们儿的,所以她并不想和其他的妹子相邻,而其他

    的妹纸也表现出很傲慢,非要站在一起。另外,由于b 是高一的,所以我们不能让他

    当出头鸟,也就是不能把他排在第2 个出场(a 之后),当然也不能欺负他,也

    就是不能让他最后一个出场。

    (一大堆描述终于完了,不知道你们读懂没,反正我是晕了……)

    总之,信奥班有N 个男生,其中a 第一个出场,b 不能第二或者最后出场。

    来了M 个女生,其中有1 个女生不能与其他女生相邻,而剩下的M-1 个女生必须相邻。

    作为主持人的a 想知道我们有多少种合法的出场顺序。

    输入描述 Input Description

    一行两个整数,N 和M,用空格隔开,分别表示N 个男生和M 个女生

    输出描述 Output Description

    一行一个整数,合法方案总数,最终结果可能会很大,把它对100000007 取模再输出。

    样例输入 Sample Input

    样例一:

    2 2

    样例二:

    4 3

    样例输出 Sample Output

    2

    96

    数据范围及提示 Data Size & Hint

    对于10%的数据:N<=5, M<=5

    对于30%的数据:N<=100,M<=2

    对于所有的数据:2<=N <=100000, 2<=M<=100000

    分类标签 Tags 点此展开 

     
    暂无标签
    10分代码(朴素乘法):
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,m;
    int A(int n){
        int res=1;
        for(int i=n;i>1;i--){
            res*=i;
        }
        return res;
    }
    int solve(int n,int m){
        return A(m-1)*A(n-1)*(2+(n-1)*(n-2));
    }
    int main(){
        scanf("%d%d",&n,&m);
        printf("%d
    ",solve(n,m));
        return 0;
    }
    AC代码:
    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int mod=100000007;
    int go(int x,int y){//快速乘法 x*y
        int res=0;
        while(y){
            if(y&1) res=(res+x)%mod;
            y>>=1;
            x=(x+x)%mod;
        }
        return res%mod;
    }
    int A(int n){
        int res=1;
        for(int i=n;i>1;i--)
            res=go(res,i);
        return res;
    }
    int solve(int n,int m){
        return go(go(A(m-1),A(n-1)),(2+go((n-1),(n-2))));
    }
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        printf("%d
    ",solve(n,m));
        return 0;
    }

     long long即可

    #include<cstdio>
    #include<iostream>
    #define ll long long  
    using namespace std;
    const int mod=100000007 ;
    ll n,m;
    ll A(ll n){
        ll res=1;
        for(int i=n;i>1;i--){
            res=(res*i)%mod;
        }
        return res;
    }
    ll solve(ll n,ll m){
        ll x=(A(m-1)*A(n-1))%mod;
        return (x*(2+(n-1)*(n-2)))%mod;
    }
    int main(){
        scanf("%lld%lld",&n,&m);
        printf("%lld
    ",solve(n,m));
        return 0;
    }
  • 相关阅读:
    搭建JUnit环境
    搭建日志环境并配置显示DDL语句
    先建表还是先建实体类
    hbm2ddl
    总结与提纲
    常见O/R框架介绍
    hibernate 模拟实现和What is and Why O/R Mapping
    hibernate 注解不给提示
    额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~
    导入android工程@Override报错
  • 原文地址:https://www.cnblogs.com/shenben/p/5656529.html
Copyright © 2020-2023  润新知