题目描述
今年就这么结束了, zdw感到十分失望
蓝桥杯写错签到题, cf rating狂掉, 最后区域赛打铜, 还突然变成JBer了
失落的zdw准备睡觉(真咸鱼), 他想关灯, 然而发现开关坏了
zdw愤怒地敲击着开关, 然后发现一个很神奇的事情:
如果灯之前已经关过了xx次, 那么下一次打开它以后再关上它需要使用x+1x+1次开关
具体情况请参考样例. 一开始灯是开着的
输入描述
第一行一个整数TT表示数据组数
接下来TT行每行一个整数nn表示zdw使用开关的次数
输出描述
共TT行, 每行一个字符串"ON"或"OFF"表示目前灯是开着还是关着的
具体见样例
样例输入
9 0 1 2 3 4 5 6 7 8
样例输出
ON OFF ON ON OFF ON ON ON OFF
样例描述
0次时就是初始状态, 显然灯是开着的
1次时之前灯没有关上过, 所以按1次后灯就关上了, 是OFF
2次时灯重新被打开了
3-4次时因为灯之前已经关上1次了, 所以需要按2下来让灯再次关上(按完第4下后关上了)
5次时灯又重新被打开了
6-8次时因为灯之前已经关上2次了, 所以需要按3下来让灯再次关上(按完第8下后关上了)
数据范围
TT <= 100000
nn <= 10^18
子任务1:(10分)
nn <= 10^8
子任务2:(20分)
无其他限制
题目来源
zdw1999
因为题目给出的数据过大,故找出规律
1=1 4=1+3 8=1+3+4 13=1+3+4+5 19=1+3+4+5+6 26=1+3+4+5+6
m+2=n*(n+1)/2
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define LL long long
int main()
{int T;scanf("%d",&T);LL n;while(T--){scanf("%lld",&n);LL mod=(LL)sqrt(2*n+4);if(mod*(mod+1)==2*n+4)printf("OFF\n");elseprintf("ON\n");}return 0;
}
二分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll n;
int main()
{int T;scanf("%d",&T);while(T--){scanf("%lld",&n);if(n==0){puts("ON");continue;}if(n==1){puts("OFF");continue;}ll l=1,r=(ll)1e9,a,b;while(l<r){ll mid=(l+r+1)/2;a=1LL*mid*(ll)(5+mid);b=2LL*(n-1);if(a>b)r=mid-1;else l=mid;}a=1LL*l*(5+l);b=2LL*(n-1);if(a==b)puts("OFF");else puts("ON");}return 0;
}