牛客练习赛24--石子阵列

石子阵列

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

xb有m种石子,每种无限个,Ta想从这些石子中取出n个,并按顺序排列起来,为了好看,相邻的石子不能相同。xb想知道有多少种排列的方法。

输入描述:

第一行有两个正整数n,m。

输出描述:

 

第一行一个整数,表示在m种石子中取出n个的排列方案数模1000000007后的值

示例1

输入

复制

1 1

输出

复制

1

示例2

输入

复制

2 3

输出

复制

6

示例3

输入

复制

3 3

输出

复制

12

备注:

对于100%的测试数据:
1 ≤ n, m ≤ 1000
数据量较大,注意使用更快的输入输出方式。

思路:

因为是取n个数, 第一次有m 种情况 , 第二次有m-1种情况 , 第三次有m-1种情况。。。。第n 次有m-1种

所以m*(m-1)^(n-1) 用个快速幂。。。。。

代码:

#include <stdio.h>
#include <bits/stdc++.h>
#include <iostream>
const int M = 1000000007; 
using namespace std;
long long quickpow(long long a, long long b)
{
    if (b < 0)
    {
        return 0;
    }
    long long ret = 1;
    a %= M;
    for (; b; b >>= 1, a = (a * a) % M)
        if (b & 1)
        {
            ret = (ret * a) % M;
        }
    return ret;
}

int main()
{
	long long int n , m;
	while(~scanf("%lld %lld" , &n , &m))
	{
		long long int w = m * quickpow(m-1 , n-1);
		printf("%lld\n" ,w%M );
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41593380/article/details/81583173