Problem I. 2333
题目
现在,给定一个有规律的数列的规律,询问该数是多少?
这个数列由 2 和 3 构成他们的前 10 项为:2,3,3,2,2,2,3,3,3,2…
或许你并不明白这是个什么玩意,聪明的 2233 娘告这个数列由 233 开头,可以把数列中连续相同的数字看整体。
(2),(33),(222),(333),(22),(33)…
并且你把括号内的数个数写出来后还能得到原来的
(2) (33) (222) (333) (22) (33)…
2 3 3 2 2…
第一个(2)下面没有对应的数。
(33)有两个 3 说明原来的数列开头是 2,(222)有 3 原来的数列第二项是 3。(333)有 3 个 3 说明原来的数是 3…括号内的 2,3 是交替出现的。
你可以简单的发现它们每一项跟前面的项都是相关虽然 33 是机器人但是她的运算速度似乎不够尽人意她会给你多组询问,让你来回答每组询问的答案。
Input
输入包含多组数据。
第一行 T (1 ≤ 𝑇 ≤ 105) 代表数据总数。
每一组询问包含一个 n (1 ≤ 𝑛 ≤ 107) 为询问的第 n 项
Output
对于每组询问输出一行即为第 n 项。
Sample input
4
1
2
3
1000000
Sample Output
2
3
3
3
思路
(1)2,3交替进行:那么通过z判断是2还是3
(2)从a[1]开始读,读到2,则向数组中加2个数,读到3,则加3个
数,x表示数组长度
AC代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10000008];
int main()
{
int x=1,s,p,z=1;;
a[1]=2;
for(int i=1;;i++)
{
if(z%2==0)s=2;
else s=3;
if(a[i]==2)
{
p=2;
for(int j=x+1;j<x+1+p;j++)
{
a[j]=s;
}
}
else
{
p=3;
for(int j=x+1;j<x+1+p;j++)
{
a[j]=s;
}
}
z++;
x=x+p;
if(x>=10000000)break;
}
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}