题目描述
有
n
n
n 块积木排成一排,小爱需要给每块积木染色,颜色有
m
m
m 种,请问有多少种方法,能使相邻两块积木的颜色均不相同?
输入格式
输入两个正整数
n
,
m
n,m
n,m
输出格式
输出满足条件的方案数模
1
0
9
+
7
10^9+7
109+7 的结果
数据范围
对于 30% 的数据,
1
≤
n
,
m
≤
10
1≤n,m≤10
1≤n,m≤10
对于 60% 的数据,
1
≤
n
,
m
≤
1
0
4
1≤n,m≤10^4
1≤n,m≤104
对于 100% 的数据,
1
≤
n
≤
1
0
15
1≤n≤10^{15}
1≤n≤1015 ,
1
≤
m
≤
1
0
9
1≤m≤10^9
1≤m≤109
样例数据
输入:
3 2
输出:
2
说明:
合法的染色方案有:{1,2,1} {2,1,2}
分析:
思路一
背景:学过搜索的同学们窃喜。
这题,其实可以用搜索来写,爆搜可以那30分
代码:
30分
#include <bits/stdc++.h>
using namespace std;
long long ans,m,s=0,n,a[10010];
void dfs(long long x){
if(x>n){
ans++;
return ;
}
for(int j=1;j<=m;++j){
if(a[x-1]!=j){
a[x]=j;
dfs(x+1);
a[x]=0;
}
}
}
int main(){
cin>>n>>m;
dfs(1);
cout<< ans << endl;
return 0;
}
思路二
背景:想一下,求
1
0
9
10^9
109为多少?
可以把
1
0
9
10^9
109给分成
(
1
0
4
)
2
(10^4)^2
(104)2*2
1
0
4
10^4
104是多少呢?
拆成
(
1
0
2
)
2
(10^2)^2
(102)2
以此类推······。
这时就有大 聪明问了:为什么有的要乘2,有的不乘?
看次方!!!!!!!!!!!!!!
或者
把九化成二进制呀!!!!!!!
化成二进制就是1001
又是一种思路!!!!!!
把数拆成二进制,然后进行判断
代码:
100分
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long ans,m,s=0,n,a[80],js;
int main(){
cin>>n>>m;
long long t=n-1;
while(t>0){
a[js++]=t%2;
t/=2;
}
ans=1;
for(int i=js-1;i>=1;--i){
if(a[i]){
ans=ans*ans%mod*(m-1)%mod;
}else{
ans=ans*ans%mod;
}
}
cout<< ans*m%mod << endl;
return 0;
}
思路三
可以用递推实现
代码:
60分
#include <bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long ans,m,s=0,n;
int main(){
cin>>n>>m;
ans=m%mod;
for(int i=1;i<=n-1;++i){
ans=ans*(m-1)%mod;
ans%=mod;
}
cout<< ans%mod << endl;
return 0;
}