这个问题可以通过动态规划来解决。我们可以定义一个状态dp[i][j],表示前i个牛舍中最后一个牛舍的颜色是j的涂色方案数量。然后我们可以通过状态转移方程来更新dp[i][j]。
状态转移方程如下:
dp[i][j] = dp[i-1][k] (k != j)
然后我们需要对所有的dp[i][j]求和,得到的结果就是所有的涂色方案数量。
但是由于n和m的范围都可以达到1e12,直接使用动态规划会导致时间复杂度和空间复杂度都无法接受。因此我们需要找到一个更有效的方法来解决这个问题。
观察可以发现,如果我们知道了前i-1个牛舍的涂色方案数量,那么我们就可以通过一次计算得到前i个牛舍的涂色方案数量。因此我们可以使用矩阵快速幂来优化我们的算法。
以下是C++代码实现:
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll quick_pow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int main() {
ll n, m;
cin >> n >> m;
ll ans = quick_pow(m, n);
ll temp = quick_pow(m-1, n-1) * m % mod;
ans = (ans - temp + mod) % mod;
cout << ans << endl;
return 0;
}
在这段代码中,我们首先读取输入的n和m,然后计算m的n次方和(m-1)的(n-1)次方乘以m,这两个值分别代表所有的涂色方案数量和不会让奶牛发疯的涂色方案数量。然后我们将两个值相减,得到的结果就是会让奶牛发疯的涂色方案数量。最后,我们输出结果。