快速幂---Yuanyuan Long and His Ballons

今天想练习一下快速幂的题目,就随便找了一道简单 的题目
在这里插入图片描述
在这里插入图片描述
示例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,

扫描二维码关注公众号,回复: 11472648 查看本文章

a[5]=a[3]×(3-1)+a[4]×(3-2)=6,

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107672671