Codeforces Round #392 (Div. 2)
C. Unfair Poll
就是数数,先找周期,一个周期是这样的
1 2 3 …………………………………………..m
m+1, m+2, m+3 ………………………. 2m
2m+1, 2m+2, 2m+3……………………3m
………………………………………………………..
(n-2)m+1, (n-2)m+2…………………..(n-1)m
(n-1)m+1, (n-1)m+2,…………………..nm
((n-2)m+1, (n-2)m+2…………………..(n-1)m
………………………………………………………..
m+1, m+2, m+3 ………………………. 2m
然后再重复这样的周期,观察可以发现第一行和第n行的数一个周期只加1次,其余各行各数加2次,一个周期元素个数为T = n*m + (n-2)*m;(n!=1)或 T = 1(n=1)
先用k求出有多少个周期,最后剩下那部分直接模拟就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long int ll;
const int maxn = 105;
ll a[maxn * maxn];
int main()
{
// freopen("in.txt","r",stdin);
memset(a,0,sizeof(a));
ll n,m,k,x,y,T;
scanf("%lld %lld %lld %lld %lld",&n,&m,&k,&x,&y);
if(n==1)T = m;
else T = n*m + (n-2)*m;
ll tot = n*m;
ll maxv = 0,minv = k;
ll aver = k/T;
// printf("%lld\n",aver);
if(k >= T){
for(ll i = 1;i<= m; ++i) a[i] = aver;
for(ll i = m+1;i<= (n-1)*m; ++i) a[i] = 2*aver;
for(ll i = (n-1)*m+1;i<= tot; ++i) a[i] = aver;
k = k - k/T*T;
}
// printf("%lld\n",k);
if(k<=tot){
for(ll i=1;i <= k;++i)++a[i];
}
else{
for(ll i=1;i <= tot ;++i)++a[i];
k = k - tot;
ll pos = (n-2)*m+1,cnt=0;
while(k--){
++a[pos];
// printf("pos = %lld\n",pos);
++pos;
++cnt;
if(cnt%m==0)pos=(n-2 - cnt/m)*m+1;
}
}
for(ll i=1;i<=tot;++i){
if(maxv < a[i])maxv = a[i];
if(minv > a[i])minv = a[i];
}
/* for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
printf("%lld: %lld ",(i-1)*m+j,a[(i-1)*m+j]);
}
printf("\n");
}
*/
printf("%lld %lld %lld\n",maxv,minv,a[(x-1)*m+y]);
return 0;
}