今天想练习一下快速幂的题目,就随便找了一道简单 的题目
示例1:
输入
3
3 3
4 2
5 3
输出
6
2
30
题意:小龙为气球添加颜色,总共n个气球,k种颜色,求总共有多少种solution
起初想到的是快速幂后来写的太复杂了,就…嘿嘿,另辟蹊径了
复杂的方法:
代码:
在此之前我们了解一下一个公式:
用K种颜色 涂 N个区域,相邻两个区域不重色,有种数=k(k-2)ⁿ⁻¹+(-1)ⁿ⁻¹k(k-2)
#include<stdio.h>
#include<iostream>
using namespace std;
#define ll long long
const ll mod=100000007;
// 一个环上涂颜色,相邻的色不能相同。
// 思路: 用m种颜色在n个区域涂色 公式 (m-1)^n+(m-1)(-1)^n
int main(){
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
int m=k-1;
ll res=1;
for(int i=1;i<=n;i++)
res=res*m%mod;
if(n%2)res-=m; // n&1
else res+=m;
cout<<res<<endl;
}
return 0;
}
简单的方法:
上代码:
#include <bits/stdc++.h>
using namespace std;
const int mod = 100000007;
long long a[10001];
int n,k;
int main(){
int T;
cin>>T;
while(T--){
cin>>n>>k;
a[0]=k;a[1]=0;
for(int i=2;i<=n;i++){
a[i]=(a[i-2]*(k-1)+a[i-1]*(k-2))%mod;
}
cout<<a[n]<<endl;
}
return 0;
}
这是以第三组数据画出的推导图,推导过程如下:
a[2]=a[0]×(3-1)+a[1]×(3-2)=6,
a[3]=a[1]×(3-1)+a[2]×(3-2)=6,
a[4]=a[2]×(3-1)+a[3]×(3-2)=18,
a[5]=a[3]×(3-1)+a[4]×(3-2)=6,