分析:
如果问题是要求最后一个删除的数,重新编号为0到n-1,f[n]表示答案,那么f[n] = (f[n-1]+k)%n。
因为删掉下标k-1以后可以从下标k重新编号为0。
在这个问题只需要推出最后三个树,然后三个数一起转移即可。
单个case的复杂度O(n)
#include<bits/stdc++.h> using namespace std; const int maxn = 5e5+1; int f[maxn][3]; //#define LOCAL int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif int T; cin>>T; f[1][0] = 0; while(T--){ int n,k; scanf("%d%d",&n,&k); for(int i = 2; i <= 3; i++) { bool exs[3] = {}; for(int j = 0; j < i-1; j++){ f[i][j] = (f[i-1][j]+k)%i; exs[f[i][j]] = true; } for(int j = 0; j < i; j++){ if(!exs[j]) { f[i][i-1] = j; break; } } } for(int i = 4; i <= n; i++){ for(int j = 0; j < 3; j++){ f[i][j] = (f[i-1][j]+k)%i; } } for(int j = 2; j >= 0; j--){ printf("%d%c",f[n][j]+1,j?‘ ‘:‘\n‘); } } return 0; }
时间: 2024-10-11 19:25:02