codeforce 102 (div 2)
B题
这题首先是求两个字符串的最小公倍数lcm,从样例分析来看,字符串的最小公倍数大小必须是两个字符串的大小的公倍数。因此可以先求出两字符串长度的最小公倍数,注意一下这里的最小公倍数的求法:
lcm(s, t) = s.size ()*t.size()/ __gcd(s.size(), t.size())
注意这里的__gcd(int a, int b)函数是万能头文件**<bits/stdc++.h>**中的,直接用就好了。
求出了lcm之后,我们就可以利用最小公倍数的性质,即它必须是这两个数的倍数,通过一个字符串来求另一个字符串,并对比利用公倍数求出来的另外一个字符串是否与题给的另外一个字符串相等。我一直在思考的一个问题是到底要是在什么情况下才输出“-1”呢?其实想一想也很简单,就是如果利用公倍数求出来的另外一个字符串与题给的另外一个字符串不相等,则说明这两个字符串的最小公倍数确实不存在,此时,我们可以输出“-1”,其他情况下可以利用最小公倍数大小以及其中任意一个字符串求出需要累加的另外一个字符串通过将其累加来计算。
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int a[1000];
//3
//baba
//ba
//baba
//aa
//aaa
//aaaaaa
//aba
//ab
//-1
string mul(string s, int t){
string res = "";
while(t--)
res = res + s;
return res;
}
int main() {
int T, cs = 0;
cin >> T;
while(T--){
string s, t;
cin >> s >> t;
int g = __gcd(s.size(), t.size());
int lcm = s.size()*t.size()/g;
string ans = mul(s, lcm / s.size());
if(ans != mul(t, lcm/ t.size()))
ans = "-1";
cout << ans << "\n";
}
return 0;
}