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; }
總結(jié)
- 上一篇: 不使用加减乘除符号计算加法
- 下一篇: HDU3113(工科数学分析之分解)