石子阵列
时间限制: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;
}