枝形吊灯,由 N 个按一个圆圈排放的灯泡组成玩下面这个游戏: 在时间 T, 如果某个灯泡左边相邻的那个灯泡在 T-1 时间是开的,则切换这个灯泡的状态。 B 时间内玩这个游戏,给出灯泡的初始状态, 输出在 B 时间后灯泡的最终状态。
这是今天考试的第一题,我以为它很简单(实际上也很简单 ),看了一眼那极致的数据范围,面不改色打了一个暴搜,输入一个极大的数据,它就理所当然地炸了。
然后我就开始了走上今天这条不归路——我瞅了眼n的数据范围3<=N<=16,脑子一抽放弃了电脑,开始人脑计算,算了2小时,就如同昨日一般,其他题没有时间了所以只打了暴力分。
下面是一双年轻的手算出来的规律:
3:3个为一循环
4:b>3的全是0
5:15个为一循环
6:b>1后6个为一循环
7:b>1后7个为一循环
8:b>7的全是0
9:63个为一循环
10:b>1后30个为一循环
11:341个为一循环
12:b>3后12个为一循环
13:819个为一循环
14:b>1后14个为一循环
15:15个为一循环
16:b>15的全是0
下面附上那个长的像打表的代码:
#include<bits/stdc++.h> using namespace std; long long n,b,x=1; int cc[20],mm[20]={0}; int main(){ freopen("blink.in","r",stdin); freopen("blink.out","w",stdout); cin>>n>>b; for(int i=1;i<=n;i++)cin>>cc[i]; if((n==4||n==8||n==16)&&b>=n)b=n; if(n==3||n==15){ if(b%n==0)b=n; else b=b%n; } if(n==6||n==7||n==14){ if((b-1)%n==0)b=n+1; else b=(b-1)%n+1; } if(n==5){ if(b%15==0)b=15; else b=b%15; } if(n==9){ if(b%63==0)b=63; else b=b%63; } if(n==11){ if(b%341==0)b=341; else b=b%341; } if(n==13){ if(b%819==0)b=819; else b=b%819; } if(n==12){ if((b-3)%n==0)b=n+3; else b=(b-3)%n+3; } if(n==10){ if((b-1)%30==0)b=31; else b=(b-1)%30+1; } while(x<=b){ for(int i=1;i<=n;i++) if(cc[i]==1&&i+1<=n){ mm[i+1]=1; } else if(cc[i]==1&&i+1>n){ mm[1]=1; } for(int i=1;i<=n;i++) if(mm[i]==1){ mm[i]=0; if(cc[i]==1)cc[i]=0; else cc[i]=1; } x++; } for(int i=1;i<=n;i++)cout<<cc[i]<<endl; }
衷心祝愿大家不要像我一样!