嗜血魂K

导航

1.4 Arithmetic Progressions

3个优化就可以过了。。。预处理所有bisquare并排序,以及一个bool数组判断是否有某个bisquare

我的思路是先b后a。。。

1.要满足有N个数  b <= MAXNUM/N

2.a <= MAXNUM-b*(N-1),不满足就break

3.a从预处理的bisquare数组中顺次选择

最多得3.4s吧。。。

---------------------------------------------------------------------------------------------------------------

粗略看了看0.x sAC同学的题解。。。应该是枚举b太费时了吧。。应该可以再precalculate每两个bisquare之差存起来排序。

b直接从里面顺次取就行了。。应该是这样吧  0 0

/*
1.开一个bool数组250^2*2,存每个数的状态
2.读入数据,计算每个p^2+q^2
3.枚举b<-1 to MAXb<-p^2+q^2/N
枚举每一个a

*/
/*
ID:y7276571
LANG: C++
TASK: ariprog
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const long MAXN = 125000;
int N, M;
long bisquare[MAXN] = {0};
bool num[MAXN] = {false};
bool check(long a, long b)
{
for(int i = 0; i < N; i++)
if(!num[a+i*b]) return false;
return true;
}
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
freopen("ariprog.in", "r", stdin);
freopen("ariprog.out", "w", stdout);
cin >> N >> M;
long bispos = 0;
for(int p = 0; p <= M; p++)
for(int q = 0; q <= M; q++)
{
bisquare[bispos] = q*q+p*p;
num[bisquare[bispos++]] = true;
}
qsort(bisquare, bispos, sizeof(long int), cmp);
long maxb = M*M*2/(N-1);
bool isprint = false;
for(long b = 1; b <= maxb; b++)
for(long *a = bisquare, maxa= 2*M*M-b*(N-1); *(a+1) || *a; a++)
{
if(*a > maxa) break;
if((!*a || *a != *(a-1)) && check(*a,b)) { cout << *a << " " << b << endl; isprint = true; }
}
if(!isprint) cout << "NONE" << endl;
// cout << check(0,3) << endl;
// for(int i = 0; i < bispos; i++) cout << bisquare[i] << endl;
return 0;
}

 

posted on 2011-12-29 13:28  嗜血魂K  阅读(232)  评论(0编辑  收藏  举报