A -- Alarm(大数打表+数学规律+素数打表)

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

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值