ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客 开心的涂刷(快速幂)

2021-04-15 16:57:52  阅读:141  来源: 互联网

标签:开心 格子 ll 牛客 涂刷 sum mod


题目描述

链接:https://ac.nowcoder.com/acm/problem/14718
来源:牛客网

一天小明同学拿着m种颜色的油漆去涂刷n块格子,在涂刷的过程中他发现有很多种涂色方案,并很快的算出了答案,然后他发现如果涂好颜色的格子中只要存在某两个相邻的格子颜色一样,他就会感到开心,他想知道有多少种让他开心的涂刷方案。
输入描述:
输入仅包含一行,包含两个数n,m分别表示格子数和颜色数。(1 <= n <= 1e12, 1 <= m <= 1e12)
输出描述:
输出一行包含一个整数,让小明开心的涂刷方案数。 答案对1000000007取模
示例1
输入
3 2
输出
6
说明
一共有(1, 1, 2), (2, 1, 1), (2, 2, 1), (1, 2, 2), (1, 1, 1), (2, 2, 2) 这6种方案

题解

首先,这个题有一个隐含条件,就是这n块格子在同一排,如下图:
在这里插入图片描述
然后就是全排列减去不能让小明开心的排列种数。
计算全排列的时候,就用到了高中排列组合的知识(太久没摸过数学,我想了好久才想明白)。
m种颜色,n块格子,每块格子有可能有m中涂法。
所以m* m* m* … * m(一共n项),全排列为m^n
接下来,找出每两块相邻格子的颜色都不同的排列情况数。
从第一块开始,第一块有m种颜色可以选,到第二块的时候,就只有m-1可供选择(因为不能和第一块一样),第三块,仍然是m-1种可选择,(因为虽然不可以跟第二块颜色一样,但是可以跟第一块相同),以后的所有格子都是如此。
因此,不能让小明开心的排列种数为
m*((m-1)^(n-1))
下面附上代码
如果对于快速幂算法有疑问,请参考上篇“快速幂算法”

代码

//LMY
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll quickpow(ll a,ll b) {
	ll sum=1;
	a=a%mod;
	while(b>0) {
		if(b&1) {
			sum=(sum*a)%mod;
		}
		a=a*a%mod;
		b>>=1;
	}
	return sum;
}
int main() {
	ll m,n;
	cin>>n>>m;
	cout<<(quickpow(m,n)-quickpow(m-1,n-1)*(m%mod)%mod+mod)%mod<<endl;
	return 0;
}

取模运算,请自行百度
初学算法,若有错误,欢迎指正

标签:开心,格子,ll,牛客,涂刷,sum,mod
来源: https://blog.csdn.net/qq_52109814/article/details/115730512

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有