链接:https://www.nowcoder.com/acm/contest/157/A
来源:牛客网
题目描述
xb有m种石子,每种无限个,Ta想从这些石子中取出n个,并按顺序排列起来,为了好看,相邻的石子不能相同。xb想知道有多少种排列的方法。
输入描述:
第一行有两个正整数n,m。
输出描述:
第一行一个整数,表示在m种石子中取出n个的排列方案数模1000000007后的值。
输入
1 1
输出
1
输入
2 3
输出
6
输入
3 3
输出
12
备注:
对于100%的测试数据: 1 ≤ n, m ≤ 1000 数据量较大,注意使用更快的输入输出方式。
题意:这场的时间正好是多校期间的休息日,第二天才开始打练练手感,中文题目
思路:排列组合贼菜,回想初高中老师讲的知识,我们第一个位置可以放M种,那么第二个位置可以放(M-1)种,第三个位置能放(M-1)种(如果和1号位相同,那么是1种,如果和一号位不相同那么是(m-2)种,合起来就是(m-1)种),因为限定条件只有相邻不同所以相当于每三个都满足这个关系,OK。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1086;
const int mod=1000000007;
long long dp[maxn];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
dp[1]=m;
for (int i = 2; i <= n ; ++i)
{
dp[i]=dp[i-1]*(m-1)%mod;
}
printf("%lld\n",dp[n]);
return 0;
}