原题链接:http://cerberus.delosent.com:791/usacoprob2?a=Gk9WloAo5kd&S=ariprog
中文题目链接:http://www.nocow.cn/index.php/Translate:USACO/ariprog
分析:
搜索题, 感觉暴力搜索复杂度太高 最坏情况M的四次,一看参数 M <= 250并不是很大。决定暴力+剪枝+打表试试。没想到过了,系统的testcase并是很强,因为复杂度随N减小平方增长。以后想想有没有更好的solution,想了一个觉得太复杂先不写了。。
/*
PROG: ariprog
LANG: C++11
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
typedef long long ll;
const int N = 140000;
const ll MOD = 1000000007;
const int INF = 0x7fffffff;
bool s[N];
int main()
{
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");
int n, m, i, j, a, b, k, p, q;
fin >> n >> m;
for(p = 0; p <= m; p++)
for(q =0; q<=m; q++)
s[p*p+q*q] = 1;
bool flag = false, flag2 = false;
int M = 2 * m * m;
for(b = 1; (n-1)*b <= M; b++){
for(a = 0; a+b*(n-1) <= M; a++){
flag = true;
for(k = 0; k < n; k++){
if(!s[a+k*b]){
flag = false;
break;
}
}
if(flag){
fout << a << " " << b << endl;
flag2 = 1;
}
}
}
if(!flag2)
fout << "NONE" << endl;
return 0;
}
n = 25, m = 250 : 2.5s (系统测试)
n = 5 , m = 250: 20s
n = 3, m = 250: 98s