#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[101000],c[101000],num[101000];
int main()
{
LL n,cir,m;
while(scanf("%lld%lld%lld",&n,&cir,&m)!=EOF)
{
LL cnt=0;
for(LL i=1;i<=n;i++) //去重
{
scanf("%lld",&a[i]);
if(a[i]!=c[cnt])
{
c[++cnt]=a[i];
num[cnt]=1;
}
else
{
num[cnt]++;
if(num[cnt]==cir) cnt--;
}
}
if(!cnt) {printf("0\n");continue;}
LL sum=0;
for(LL i=1;i<=cnt;i++) sum+=num[i];
LL k,k1;
LL s=0;
for(k=1,k1=cnt+1-k;k<k1;k++,k1--) //模拟连接两段后的情况
{
if(c[k]==c[k1]&&num[k]+num[k1]==cir) s=s+cir;
else break;
}
if(k<k1) //中间约后所剩个数的情况>=2
{
if(c[k]==c[k1]&&num[k]+num[k1]>cir) s=s+cir;
printf("%lld\n",sum*m-s*(m-1));
}
else if(k==k1) //==1
{
LL ans=(num[k]*m)%cir; //约去后只剩一种数能整出没问题,除不了加两段
if(ans) ans+=sum-num[k];//总和减去会变化求得的值
cout<<ans<<endl;
}
}
return 0;
}
思维模拟
最新推荐文章于 2020-09-28 18:03:13 发布