输入样例:
5 6 100
1 3 2 2 1
3 3 1 1 1 2
输出样例:
29
乍一看,还以为是枚举,一瞅K的范围,想了想,才晓得是数学周期问题。
也不难,只要求出一个周期赢几次,接着求剩下的,加起来,输出就没了。
上代码!
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[102005],b[102005],s,ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>a[i]; //读入
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=n*m;i++){ //一个周期ps:一个周期原来要用公倍数的,我懒,没用……
if(a[i]==1&&b[i]==2||a[i]==2&&b[i]==3||a[i]==3&&b[i]==1) s++;
a[i+n]=a[i],b[i+m]=b[i]; //把比较完的放到最后,就是死循环了(除非内存BOOM炸了)
}
ans=k/(n*m)*s; //ans是答案
for(int i=1;i<=k%(n*m);i++){ //求剩下的 ↑上面复制一下↑
if(a[i]==1&&b[i]==2||a[i]==2&&b[i]==3||a[i]==3&&b[i]==1) /*这里的s改成ans*/ans++;
a[i+n]=a[i],b[i+m]=b[i];
}
cout<<ans;
return 0;
}
代码不长的,主要是你想到没……