中石油新生赛第八场 问题 F: 量子计算

题目描述
做完基因锁手术后,小X又被机器狗带回到了会客舱,外星首领请小X喝了杯龙冠龙井,说道:“此茶乃 G20 峰会专用,对你的术后恢复大有裨益,在送你回地球之前,你可以再问一个问题。”小X问道:“人类这么多年都未能破译基因密码,你们是如何做到的呢?”外星首领答道:“这全靠我们的科学家发明的128 位量子计算机,它的计算速度大约是 2 的 128 次方,而地球上最快的光电计算机目前最快能算到 2 的32 次方左右。”小X梦醒之后上网查阅了一下有关量子计算机的最新发展状况,发现米国已经在研制 50 位的量子计算机了,联想到最近发生的中兴事件,小X心想一旦量子计算技术再受制于人,那后果就十分严重了,于是小X计划研制 64 位的量子计算机,他觉得这个任务有些艰巨,需要找几位天资聪颖且志同道合的小伙伴来帮助自己,于是就想到了这次的程序设计小能手比赛,小X出了下面这个题目来考考小朋友们,通过的同学将有机会跟小X一起研制量子计算机哦!一个圆被均分成了 n 个区域,现有 m 种可供选择的颜色给图中的区域涂色,每一个区域只能涂一种颜色,且相邻的区域要涂不同的颜色,问有多少种不同的涂色方式?由于结果很大,你只要输出结果除以10000007 的余数的值。
以下是 n=5 的时候的圆被分成的样子。
输入
输入数据仅有一行包含两个用空格隔开的正整数 n,m,即圆被分成了 n 个区域,有 m 种可供选择的颜色。
输出
输出数据仅有一行包含一个整数,表示不同的涂色方式,请输出对 10000007 求余后的值。
样例输入
复制样例数据 5 3
样例输出
30

提示
10%的数据 m=2
40%的数据 m<=3,n<=15
70%的数据 m<=5,n<=100
100%的数据 m<=100,n<=1000

在圆盘上n个区域,m种颜色,相邻区域颜色不能相同,涂法总数公式(来自强大的马鸿儒大佬)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int n,m,x,y=1,flag=-1;
	int ans=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		x=((m-1)*flag)%10000007;
		y=(y*(m-1))%10000007;
		flag=-flag;
	}
	ans=(ans+x+y)%10000007;
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43332389/article/details/85200938