题目链接:http://www.codeforces.com/problemset/problem/173/A
TAG:数学 字符串
题目大意 两人猜拳N【int范围内】次,一人的出拳序列是S1,另一人的是S2【长度都小于1000,不一定相同哦~。。】,其中R代表势头 S代表剪刀 P代表布。
判断N次猜拳中两人各能赢几次。
因为出拳序列长度并不一定,我们可以先将两个序列扩展成他们的最小公倍数的长度的序列,然后算出1-最小公倍数里面两人的获胜数。乘以n/最小公倍数,最后加上多出的一截。。大概就这意思凑合看吧= =。。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s1[1000111],s2[1000111];
int map[200][200]={0};
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
map['P']['S']=1;
map['S']['R']=1;
map['R']['P']=1;
int n;
cin>>n;
int count1=0,count2=0;
scanf("%s%s",s1,s2);
int len1=strlen(s1);
int len2=strlen(s2);
int t=len1/gcd(max(len1,len2),min(len1,len2))*len2;
int len=t;
int now=0;
for(int i=len1;i<len;i++)
{
s1[i]=s1[now];
now++;
now%=len1;
}
now=0;
for(int i=len2;i<len;i++)
{
s2[i]=s2[now];
now++;
now%=len2;
}
bool b=0;
if(len<n)
b=1;
for(int i=0;i<min(len,n);i++)
{
count1+=map[s1[i]][s2[i]];
count2+=map[s2[i]][s1[i]];
}
if(b==1)
{
count1*=n/len;
count2*=n/len;
for(int i=0;i<n-n/len*len;i++)
{
count1+=map[s1[i]][s2[i]];
count2+=map[s2[i]][s1[i]];
}
}
cout<<count1<<" "<<count2<<endl;
return 0;
}