#include<Servo.h>
Servo myservo_la,myservo_shou;//分别代表两个舵机
int value=0,flag1=0,sp=50;//value即接收到的光强,sp代表舵机工作速度,flag1代表窗帘的开关情况,初始为0代表窗帘是打开的
const int li_low=100,li_high=80,turns=1//li_low和li_high分别代表可以接受的亮度的最高值和最低值,在这个区间内舵机不动
int manual=0;//人工控制的标志
char serialData; //接收蓝牙信号
//在使用DF9GMS 360度舵机时write(90+-sp)中sp代表速度,正负代表转动的正负
void setup(){
myservo_la.attach(9);
myservo_shou.attach(3);
Serial.begin(9600); //串口波特率9600
}
void open_curtain()//拉开窗帘
{
flag1=1;
for(int i=0;i<turns;i++)
{
myservo_la.write(90-sp);
myservo_shou.write(90+sp);
delay(40000);//规定拉回的时间
myservo_la.write(90);
myservo_shou.write(90);
}
}
void close_curtain()//关闭窗帘
{
flag1=0;
for(int i=0;i<turns;i++)
{
myservo_la.write(90+sp);
myservo_shou.write(90-sp);
delay(40000);
myservo_la.write(90);
myservo_shou.write(90);
}
return;
}
void loop(){
value = analogRead(A0);
Serial.println(value);
if( Serial.available() > 0 ){
serialData = Serial.read();//读入蓝牙信号
if('O'==serialData)//O代表open,C代表close
{
opencurtain();
manual=1;
}
else if('C'==serialData)
{
closecurtain();
manual=1;//此时设为人工控制
}
else if('X'==serialData)
manual=0;//解除人工控制,变为光控
}
if(value<li_high&&flag1==0&&manual==0)
{
open_curtain();
}
else if(value>li_low&&flag1==1&&manual==0)
{
close_curtain();
}
}
本来以为很难的,但仔细想想和普通快速幂好像写法没什么区别尽管等会代码由于我太蒟蒻加暴力没写循环直接全部赋值,难点在于构造矩阵,这个题还挺明显的但自己还不是想不到。然后就是一般的快速幂n%2==1就乘,不是就把a数组翻倍。附上很丑的代码:
#include<stdio.h>
#include<stdlib.h>
long long qmpow(long long n)
{
long long a[3][3]={{0,0,0},
{0,1,1},
{0,1,0}},
ans[3][3]={{0,0,0},
{0,0,0},
{0,0,0}},
tmp[3][3]={0};
int i,j,flag=0;
while(n!=0)
{
if(n%2==1)
{
if(flag==0)
{
ans[1][1]=a[1][1];ans[1][2]=a[1][2];ans[2][1]=a[2][1];a[2][2]=a[2][2];
flag=1;
}
else
{
tmp[1][1]=ans[1][1]*a[1][1]+ans[1][2]*a[2][1];
tmp[1][2]=ans[1][1]*a[1][2]+ans[1][2]*a[2][2];
tmp[2][1]=ans[2][1]*a[1][1]+ans[2][2]*a[2][1];
tmp[2][2]=ans[2][1]*a[1][2]+ans[2][2]*a[2][2];
ans[1][2]=tmp[1][2];
ans[2][1]=tmp[2][1];
ans[2][2]=tmp[2][2];
ans[1][1]=tmp[1][1];
}
}
tmp[1][1]=a[1][1]*a[1][1]+a[1][2]*a[2][1];
tmp[1][2]=a[1][1]*a[1][2]+a[1][2]*a[2][2];
tmp[2][1]=a[2][1]*a[1][1]+a[2][2]*a[2][1];
tmp[2][2]=a[2][1]*a[1][2]+a[2][2]*a[2][2];
a[1][2]=tmp[1][2];
a[2][1]=tmp[2][1];
a[2][2]=tmp[2][2];
a[1][1]=tmp[1][1];
for(i=1;i<=2;i++)
for(j=1;j<=2;j++)
{
a[i][j]%=1000000007;
tmp[i][j]%=1000000007;
ans[i][j]%=1000000007;
}
n=n/2;
}
printf("%lld",(ans[1][1]+ans[1][2])%1000000007);
return 0;
}
int main()
{
long long n;
scanf("%lld",&n);
if(n==1||n==2)
{
printf("1");
return 0;
}
qmpow(n-2);
return 0;
}