http://acm.hdu.edu.cn/showproblem.php?pid=1538
经典经济学问题,海盗分金
分析http://www.guokr.com/article/41423/
#include <iostream> #include <cstdio> using namespace std; int a[15]; int main() { a[0] = 2; for(int i = 1; ; i++) { a[i] = a[i-1] * 2; if(a[i] * 2 > 10000) break; } int T; scanf("%d", &T); int n, m, p; while(T--) { scanf("%d%d%d", &n, &m, &p); int flag; if(n <= 2*m) { if(p == n) { printf("%d\n", m-(n-1)/2); } else { flag = n & 1; if((p & 1) == flag) puts("1"); else puts("0"); } } else if(n == 2*m+1) { if(p < 2*m && (p & 1)) puts("1"); else puts("0"); } else { flag = 0; for(int i = 0; i < 13; i++) { if(a[i] == n-2*m) { puts("0"); flag = 1; } } if(flag) continue; flag = 0; if(p > 2 * m) { for(int i = 1; i < 13; i++) { if(a[i]+2*m > n) if(p-2*m > a[i-1] && p-2*m < a[i]) { flag = 1; puts("Thrown"); } } if(!flag) puts("0"); } else { puts("0"); } } } return 0; }