1.4.1 Arithmetic Progressions

  
    
  1. /*
  2. ID: awsd1231
  3. PROG: ariprog
  4. LANG: C++
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<algorithm>
  9. #include<set>
  10. using namespace std;
  11. int n, m;//等差数列长度,双平方数上界
  12. struct T {
  13. int a, b;
  14. }ans[10005];
  15. bool may[125005] = {0};
  16. set<int> list;
  17. void fill(int x) {
  18. int t = 0;
  19. for(int i = 0; i != x + 1; ++i)
  20. for(int j = 0; j != x + 1; ++j) {
  21. may[i*i + j*j] = 1;
  22. list.insert(i*i + j*j);
  23. }
  24. }
  25. bool check(int x, int y) {
  26. int ni = 0;
  27. while(ni != n){
  28. // if(!may[x + (n - 2) * y])return false;
  29. if(may[x + ni * y]) ++ni;
  30. else return false;
  31. }return true;
  32. }
  33. bool operator < (T a, T b) {
  34. if(a.b != b.b) return a.b < b.b;
  35. return a.a < b.a;
  36. }
  37. int main() {
  38. freopen("ariprog.in", "r", stdin);
  39. freopen("ariprog.out", "w", stdout);
  40. cin >> n >> m;
  41. fill(m);
  42. int idx = 0, t = 0;
  43. set<int>::iterator lis = list.begin();
  44. for(int a = *lis; a < m*m*2-1; a = *(++lis)) {
  45. for(int b = 1; b != (2*m*m - a) / (n-1) + 1; ++b) {
  46. if(check(a, b)) {
  47. ans[idx].a = a;
  48. ans[idx++].b = b;
  49. }
  50. }
  51. }
  52. if(idx) {
  53. sort(ans, ans+idx);
  54. for(int i = 0; i != idx; ++i) {
  55. cout << ans[i].a << " " << ans[i].b << endl;
  56. }
  57. }else
  58. cout << "NONE" << endl;
  59. return 0;
  60. }





你可能感兴趣的:(progress)