假设老师从第一行叫到最后一行或者从最后一行叫到第一行是一轮,可以得到式子m(nq-q+1)<=k,由此可以推出q(轮数)的最大值。
剩余的叫的次数就可以暴力了。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll K;
int n,m,x,y;
ll ci[110];
int a[110][110];
int main()
{
// freopen("c.in","r",stdin);
scanf("%d%d%I64d%d%d",&n,&m,&K,&x,&y);
if(n==1)
{
if(K%(ll)m==0)
printf("%I64d %I64d %I64d
",K/(ll)m,K/(ll)m,K/(ll)m);
else
printf("%I64d %I64d %I64d
",K/(ll)m+1ll,K/(ll)m,(ll)y<=K%(ll)m ? K/(ll)m+1ll : K/(ll)m);
return 0;
}
ll q=(K-(ll)m)/(ll)(m*(n-1));
ll _n=q/2ll;
ll _1=(q-1)/2ll;
for(int i=2;i<n;++i)
ci[i]=q;
ci[1]=q-_1;
ci[n]=q-_n;
int nowx;
if(q%2==1)
nowx=n-1;
else
nowx=2;
int nowy=1;
bool flag;
if(q%2==1)
flag=1;
else
flag=0;
if(q==0)
nowx=1;
for(ll i=(q==0 ? 1ll : (ll)m*((ll)n*q-q+1ll)+1ll);i<=K;++i)
{
++a[nowx][nowy];
if(nowy!=m)
++nowy;
else
{
nowy=1;
if(nowx==n)
{
nowx=n-1;
flag=1;
}
else if(nowx==1)
{
nowx=2;
flag=0;
}
else
{
if(flag)
--nowx;
else
++nowx;
}
}
}
ll maxv=0,minv=1000000000000000001ll;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
maxv=max(maxv,ci[i]+(ll)a[i][j]);
minv=min(minv,ci[i]+(ll)a[i][j]);
}
printf("%I64d %I64d %I64d
",maxv,minv,ci[x]+(ll)a[x][y]);
return 0;
}