Advertisement
Guest User

Untitled

a guest
Jun 7th, 2011
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <string.h>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <memory.h>
  10. #include <algorithm>
  11. #include <math.h>
  12. #include <queue>
  13. using namespace std;
  14. typedef long long li;
  15. typedef long double ld;
  16. #define mp make_pair
  17. #define pb push_back
  18. typedef pair <li, li> pi;
  19. typedef vector <li, li> vli;
  20. typedef vector <int> vi;
  21. void solve ();
  22. int main ()
  23. {
  24. #ifdef _DEBUG
  25.         freopen ("in.txt", "r", stdin);
  26.         //freopen ("out.txt", "w", stdout);
  27. #endif
  28.         int t=1;
  29.         while (t--)
  30.         solve ();
  31. }
  32. #define int li
  33. int n;
  34. int kuda;
  35. int gr[100500];
  36. int doing ( int k )
  37. {
  38.         if ( gr[k]!=-1 )
  39.                 return gr[k];
  40.         int now=2*k;
  41.         vector <int> del;
  42.         for ( int i=2; i*i<=now; i++ )
  43.                 if ( now%i==0 )
  44.                 {
  45.                         del.pb (i);
  46.                         if ( i*i!=now )
  47.                                 del.pb (now/i);
  48.                 }
  49.         sort (del.begin(), del.end());
  50.         int num=0;
  51.         int ans=0;
  52.         for ( int i=0; i<del.size(); i++ )
  53.         {
  54.                 int curans=1;
  55.                 int h=now/del[i];
  56.                 if ( h>=del[i]+1 && (h-del[i]-1)%2==0 )
  57.                 {
  58.                         int z=h-del[i]-1; z/=2;
  59.                         if (k==n)
  60.                         cout<<z<<' '<<del[i]<<endl;
  61.                         for ( int j=1; j<=del[i]; j++ )
  62.                         {
  63.                                 int cur=doing(z+j);
  64.                                         curans^=cur;
  65.                                 //cout<<z+j<<' '<<cur<<endl;
  66.                         }
  67.                         if ( curans>ans )
  68.                         {
  69.                                 ans=curans;
  70.                                 //cout<<k<<' '<<curans<<endl;
  71.                                 num=del[i];
  72.                                 break;
  73.                         }
  74.                 }
  75.         }
  76.         gr[k]=ans;
  77.         if ( k==n && ans==1 )
  78.                 kuda=num;
  79.         return ans;
  80. }
  81. void solve ()
  82. {
  83.         cin>>n;
  84.         memset (gr, -1, sizeof (gr));
  85.         for ( int i=1; i<=n; i=i<<1 )
  86.                 gr[i]=0;
  87.         int answer=doing (n);
  88.         if ( answer )
  89.                 cout<<kuda;
  90.         else
  91.                 cout<<"-1";
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement