有一个正凸多边形,其上有n个顶点,顶点按顺时针从0-n-1依次编号,每个顶点上正好有一只猴子,下图是一个6个顶点的凸多边形。
示例 1:
输入:n = 3 输出:6 解释:共计 8 种移动方式。 下面列出两种会发生碰撞的方式: - 猴子 1 顺时针移动;猴子 2 逆时针移动;猴子 3 顺时针移动。猴子 1 和猴子 2 碰撞。 - 猴子 1 逆时针移动;猴子 2 逆时针移动;猴子 3 顺时针移动。猴子 1 和猴子 3 碰撞。 可以证明,有 6 种让猴子碰撞的方法。
每个猴子同时移动到相邻的顶点。顶点 i
的相邻顶点可以是:
- 顺时针方向的顶点
(i + 1) % n
,或 - 逆时针方向的顶点
(i - 1 + n) % n
。
如果移动后至少有两只猴子停留在同一个顶点上或者相交在一条边上,则会发生 碰撞 。
返回猴子至少发生 一次碰撞 的移动方法数。由于答案可能非常大,请返回对 10^9+7
取余后的结果。
注意,每只猴子只能移动一次。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "string.h"
#include "math.h"
#define MAX_NUM 14
int monkeyMove(int n){
long long int mod=(1e9)+7,ans=1,tmp=2;
while(n){
if(n&1)ans=((ans%mod)*(tmp%mod))%mod;
n>>=1;
tmp=(tmp%mod)*(tmp%mod);
}
return (ans-2+mod)%mod;
}
int main()
{
int max;
max= monkeyMove(3);
printf("%d",max);
return 0;
}