zoj3768Continuous Login
这题通过暴力可以看出最多不超过3 具体为什么。。等着看大牛的题解。
可以预处理出来两个数之和 用bool存下 然后枚举一个数 二分剩余数的位置就可以了 勉强可过
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 123456789 12 #define M 16000 13 #define LL long long 14 #define INF 0xfffffff 15 const double eps = 1e-8; 16 const double pi = acos(-1.0); 17 const double inf = ~0u>>2; 18 bool f[N]; 19 int g; 20 vector<int>a; 21 vector<int>::iterator it; 22 void init() 23 { 24 int i,j; 25 for(i = 1 ;; i++) 26 { 27 int k = (i)*(i+1)/2; 28 if(k<=N) 29 { 30 a.push_back(k); 31 } 32 else break; 33 } 34 g = i; 35 for(i = 0; i < g ;i++) 36 for(j = i; j < g ; j++) 37 { 38 int s = a[i]+a[j]; 39 if(s>N) break; 40 f[s] = 1; 41 } 42 } 43 int main() 44 { 45 int i,n,m; 46 init(); 47 cin>>m; 48 while(m--) 49 { 50 cin>>n; 51 it = lower_bound(a.begin(),a.end(),n); 52 if((*it)==n) 53 { 54 printf("%d\n",it+1-a.begin()); 55 continue; 56 } 57 if(f[n]) 58 { 59 for(i = 0 ;i < g ; i++) 60 { 61 int k = n-a[i]; 62 if(k<=0) break; 63 it = lower_bound(a.begin(),a.end(),k); 64 if((*it)==k) 65 { 66 printf("%d %d\n",i+1,it+1-a.begin()); 67 break; 68 } 69 } 70 } 71 else 72 { 73 int k; 74 for(i = 0 ; i < g ;i++) 75 { 76 k = n-a[i]; 77 if(f[k]) 78 { 79 printf("%d ",i+1); 80 break; 81 } 82 } 83 for(i = 0 ;i < g ;i++) 84 { 85 int kk = k-a[i]; 86 it = lower_bound(a.begin(),a.end(),kk); 87 if((*it)==kk) 88 { 89 printf("%d %d\n",i+1,it+1-a.begin()); 90 break; 91 } 92 } 93 } 94 } 95 return 0; 96 }