![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
链接:https://www.nowcoder.com/acm/contest/157/A 来源:牛客网 题目描述 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数据量较大,注意使用更快的输入输出方式。
题意:无限个m种石子中取出n个,要求相邻两个石子不能相同,求总共有多少种排列方法
思路:若第一个是m种,第二个就是(m-1)种,因为相邻两个不同,第三个又是(m-1),以此类推…所以是m*(m-1)^(n-1)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int main() { long long n,m; while(scanf("%lld%lld",&n,&m)!=EOF) { long long ans=0; if(m==1&&n==1) ans=1; else if(m==1&&n!=1) ans=0; else { ans=m; for(int i=2;i<=n;i++) { ans=ans*(m-1)%1000000007; } } printf("%lld\n",ans); } return 0; }