K倍动态减法游戏
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2580
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 2000005; int a[N],b[N]; int main() { int T,tt=1; int n,k; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); a[0] = b[0] = 1; int i = 0; int j = 0; while(a[i] < n) { i++; a[i] = b[i-1] + 1; while(a[j+1] * k < a[i]) j++; if(a[j] * k < a[i]) b[i] = a[i] + b[j]; else b[i] = a[i]; } printf("Case %d: ",tt++); if(a[i] == n) puts("lose"); else { int ans = 0; while(n) { if(n >= a[i]) { n -= a[i]; ans = a[i]; } i--; } printf("%d\n",ans); } } return 0; }
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3599
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; typedef long long LL; const LL N = 3000005; LL a[N],b[N]; int main() { LL T; LL n,k; scanf("%lld",&T); while(T--) { scanf("%lld%lld",&k,&n); a[0] = b[0] = 1; LL i = 0; LL j = 0; while(a[i] < n) { i++; a[i] = b[i-1] + 1; while(a[j+1] * k < a[i]) j++; if(a[j] * k < a[i]) b[i] = a[i] + b[j]; else b[i] = a[i]; } LL ans = 0; if(a[i] == n) ans = n - i - 1; else ans = n - i; printf("%lld\n",ans); } return 0; }