Diff

79 阅读2分钟

题目链接

题目详情

作为一个居家小能手,你深知收纳之道。至少,同一种东西不要放在一起,因为同样的东西放在一起容易分不出来……。 现在有 n (1n1000)n (1≤n≤1000) 个盒子,你现在有 k(2k1000)k(2≤k≤1000) 种物品,每种物品的数量有无限个。你现在要在每个盒子里都放一个物品,同时,你不想相邻的位置上摆同样的东西。想请问有多少种摆放方式可以满足你的要求。

输入

输入一行两个整数 n、k,表示盒子的数量和物品种类的数量。

输出

输出一行一个整数,表示方案数,数据保证答案在 int 范围内。

输入样例1

2 3

输出样例1

2

输入样例2

1 8

输出样例2

8

对于第一个样例,我们假设两种物品分别为 A 和 B,则可行的方案有且仅有 2 种:

  • ABA
  • BAB

解题思路

解题思路

这算是一道思维题,不要把它想的非常复杂,实际上就是看每个盒子中能够放多少种物品,并且保证没两个相邻的盒子中的物品种类不一样,例如:ABAA,AAB 就不可以。这时,我们可以将问题缩小,每次只看当前盒子能放几种物品。

例如有5个盒子,4种物品,我们就可以一个一个盒子看,第一个可以放5种,第二个不能和第一个相同,只能放4中,第三个不能和第二个相同,但可以和第一个相同,也可以放4种,同理第四个,第五个只需和他们前一个不同即可。

也就是说,除了第一个是k种,其它盒子都是k-1种

AC代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector> 
#include<map>
#include<cmath>
using namespace std;
#define int long long
#define endl '\n'
#define pair PII;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const int N =200010;

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, k;
    cin >> n >> k;
    int m = k;
    for (int i = 2; i <= n; i++)
    {
        m *= (k - 1);
    }
    cout << m << endl;
    return 0;
}