这题数据貌似挺水的,居然没有卡我.
思路很简单:类似于乌龟棋,把1~n-1看作一个轴,每次只能走1步或者k步,枚举走1步和走k步的数量,更新到达每个点的次数即可.
状态f[i]: 走到i
的次数的最小值.
转移方程: f[1*n+k*m]=min(f[1*n+k*m],n+m)
,n为走1步的次数,m为走k步的次数.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int f[N];
int n,k;
int main()
{
memset(f,0x3f,sizeof f);
cin>>n>>k;
f[0]=0;
for(int i=0;i<1000;i++)//走k步
for(int j=0;j<1000;j++)//走1步
{
f[(k*i+j*1)%n]=min(f[(k*i+j*1)%n],i+j);
}
int res=0;
for(int i=1;i<n;i++) res=max(res,f[i]);
cout<<res;
return 0;
}