C++連続自然数和

2575 ワード

#include using namespace std; inline unsigned nsum(unsigned s,unsigned e) {      unsigned sum = 0;      unsigned n = (e - s + 1);      if (!(n%2))          sum = n/2 * (s + e);      else          sum = (s + e)/2 * n;      return sum; } unsigned bsearch (unsigned start,unsigned end,unsigned key)  {      unsigned mid = 0;      unsigned s = start;      unsigned v = 0;      while (start < end)      {          mid = (start + end)/2;          v = nsum(s,mid);          if (v == key)                 return mid;          else if (v > key)               end = mid - 1;          else if (v < key)              start = mid + 1;      }         mid = (start + end)/2;      v = nsum(s,mid);      return v == key ? mid : -1; } int main() {      unsigned m;      unsigned s,e,sum;      scanf ( "%d" ,&m);      for ( int i = 1; i <= m/2+1; i++)      {          unsigned end = bsearch (i,m/2+1,m);          if (end != -1)              printf ( "%d %d
"
,i,end);      }      return 0; }