题目链接:https://ac.nowcoder.com/acm/contest/940/B/
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

kotori最近迷上了摆气球的游戏。她一共有n种气球,每种气球有无数个。她要拿出若干个气球摆成一排。
但是,由于气球被施放了魔法,同样种类的气球如果相邻会发生爆炸,因此若两个相邻的气球种类相同被视为不合法的。
kotori想知道,摆成一排m个一共有多少种不同的方案?
由于该数可能过大,只需要输出其对109取模的结果。

输入描述

输入仅有一行,为两个整数n和m(1≤n,m≤100)

输出描述

输出一个整数,为方案数对109取模的结果。

输入

3 2

输出

6

说明

假设3种气球标记为1、2、3,那么共有以下6种方案:[1,2] [1,3] [2,1] [2,3] [3,1] [3,2]。

解题思路

题意:求满足要求的m个气球的排列数。
思路:组合数学,第1个有n种选择,则剩余的m-1个都只有n-1种选择,故总的排列数为

Accepted Code:

#include <bits/stdc++.h>
using namespace std;
const int MOD = 109;
int pow_(int a, int b) {
    int cnt = 1;
    while (b) {
        if (b & 1)
            cnt = cnt * a % MOD;
        b >>= 1;
        a = a * a % MOD;
    }
    return cnt;
}
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    printf("%d\n", pow_(n - 1, m - 1) * n % MOD);
    return 0;
}