问题 P: 游戏
时间限制: 1.000 Sec 内存限制: 128 MB
题目描述
今天是星期天,小楠楠来找你玩“石头、剪刀、布游戏”。你正在学习信息学,所以想了一种需要编程来玩的“石头、剪刀、布游戏”。首先,用数字1,2,3分别表示出石头、剪刀、布。其次,你确定自己前N次“石头、剪刀、布”的出拳方法,下面N次再次同样出拳,…,周而复始;也要求楠楠确定他前M次的出拳方法,然后周而复始。问第K次后,你赢了几次?
例如:N=4,你的前4次出拳方式是“石头、剪刀、布、布”,用数字表示即:”1 2 3 3”。M=5,楠楠前5次出拳方式是“剪刀、石头、石头、布、布” ,用数字表示即:”2 1 1 3 3”。K=10时,情况如下表:
![](https://img-blog.csdnimg.cn/img_convert/e95f7e6807ac5a8742ad5a5d986f51d9.png)
你共赢了5次。
输入
第一行3个整数N,M,K。分别表示你出拳方式的周期长度、楠楠出拳方式的周期长度和总共玩的次数。
第二行有N个整数,每个整数为1、2、3其中之一。
第三行有M个整数,每个整数为1、2、3其中之一。
输出
一个整数,表示K轮出拳后,你赢的次数。
样例输入
5 6 100
1 3 2 2 1
3 3 1 1 1 2
样例输出
29
提示
8个数据: N,M 的范围是[1..100],K的范围是[1…100,000]。
2个数据: N,M的范围是[1..100],K的范围是[1…1,000,000,000]
代码
#include <iostream>
using namespace std;
int a[150],b[150];
int f(int w,int u)
{
if(w==1&&u==2) return 1;
if(w==2&&u==3) return 1;
if(w==3&&u==1) return 1;
return 0;
}
int main()
{
int n,m;
long long k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
long long x=n*m,k1=1,k2=1,sum=0;
long long z=k%x,s=0;
for(int i=1;i<=x;i++)
{
if(k1==n+1) k1=1;
if(k2==m+1) k2=1;
if(f(a[k1],b[k2]))
{
sum++;
}
if(k==i)
{
cout<<sum;
return 0;
}
if(i==z) s=sum;
k1++;
k2++;
}
cout<<sum*(k/x)+s;
return 0;
}