DESCRIPTION
Given a number sequence
[
3
,
7
,
22
,
45
,
116
,
.
.
.
]
[3,7,22,45,116,...]. Please tell me the
k
k-th number.
INPUT
A number
T
(
T
<
100
)
T (T<100) indicates the number of the input cases. Then for each case there only is one integer
k
(
1
≤
k
≤
10000
)
k (1≤k≤10000).
OUTPUT
For each case, ouput the
k
k-th number of the sequence in one line.
SAMPLE INPUT
2
1
4
SAMPLE OUTPUT
3
Given a number sequence
[
3
,
7
,
22
,
45
,
116
,
.
.
.
]
[3,7,22,45,116,...]. Please tell me the
k
k-th number.
INPUT
A number
T
(
T
<
100
)
T (T<100) indicates the number of the input cases. Then for each case there only is one integer
k
(
1
≤
k
≤
10000
)
k (1≤k≤10000).
OUTPUT
For each case, ouput the
k
k-th number of the sequence in one line.
SAMPLE INPUT
2
1
4
SAMPLE OUTPUT
3
45
题意:给你一串数找规律,问第k个数是多少?
思路:这一串数字乍一看没啥思路,看到最后你才会发现这些数都是素的的平方减一,发现规律你以为就好做了?NONONO,这题给的数据很大,需要找到10000个素数。这时我用__int64写 系统竟然不识别晕,然后用long long写编译器运行结果到9903就不行了成负数了。提交后竟然对了,不知道是oj测试数据太水还是编译器太水。感觉long long打表搜索到110000应该足够了。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long q[10001];
long long su[110000];
long long w[10001];
void s()
{
for(long long i=2;i<=110000;i++)
{
if(su[i]==1)
continue;
else
{
for(long long j=i*2;j<=110000;j+=i)
su[j]=1;
}
}
long long k=1;
for(long long i=2;i<=110000,k<=10000;i++)
{
if(su[i]==0)
w[k++]=i;
}
}
int main()
{
int t;
scanf("%d",&t);
s();
q[1]=3;
q[2]=7;
q[3]=22;
q[4]=45;
q[5]=116;
for(long long i=6;i<=10000;i++)
{
q[i]=w[i]*w[i]-i;
}
while(t--)
{
long long a;
scanf("%lld",&a);
printf("%lld\n",q[a]);
}
return 0;
}