K倍动态减法——Game ZOJ - 3599

在这里插入图片描述
在这里插入图片描述
题意:从N里选n个棋子作为起手。
题解:K倍动态减法,因为a里存的是必败态,所以分成n=a[i]和n!= a[i]两个部分

https://blog.csdn.net/tbl_123/article/details/24884861

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define LL long long
const int N = 3000000;
LL a[N],b[N];
int main()
{
	int t,k;
	LL n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%lld",&k,&n);
		a[0] = b[0] = 1;
		int i = 0 ,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] = b[j]+a[i];
			else b[i] = a[i];
		}
		LL ans;
		if(a[i] == n)
		ans = (LL)n-i-1;
		else
		ans = (LL)n-i;
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/82764184
ZOJ